Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:laboratoare:programare-functionala-lambda-si-streamuri [2025/12/15 11:12]
florian_luis.micu [Metode utile]
poo-ca-cd:laboratoare:programare-functionala-lambda-si-streamuri [2025/12/15 11:44] (current)
florian_luis.micu [Obiective]
Line 5: Line 5:
   * Data ultimei modificări:​ 15.12.2025   * Data ultimei modificări:​ 15.12.2025
     * adăugare secțiune despre operații short-circuit.     * adăugare secțiune despre operații short-circuit.
 +    * adăugare secțiune [Nice to know] despre Optional.
 +    * adăugare secțiune despre primitive streams.
 +    * menționarea boolean chaining când folosim interfețe funcționale de tip Predicate.
  
 ======Obiective====== ======Obiective======
Line 17: Line 20:
   * diferențe dintre stilul imperativ și stilul funcțional de programare.   * diferențe dintre stilul imperativ și stilul funcțional de programare.
   * identificarea avantajelor,​ limitărilor și capcanelor ale abordării funcționale în Java.   * identificarea avantajelor,​ limitărilor și capcanelor ale abordării funcționale în Java.
 +
 +Aspectele **bonus** urmărite sunt:
 +  * definirea și folosirea Optional în programarea în stil funcțional.
 +  * paralelizarea codului folosind parallel streams.
  
 <note warning> <note warning>
Line 23: Line 30:
 </​note>​ </​note>​
  
-======🔧 ​Programare ​funcțională======+======🔧 ​Programarea ​funcțională======
  
 +Există mai multe **paradigme de programare**,​ fiecare definind un mod diferit de a structura și exprima logica unui program. Cele mai importante sunt **programarea imperativă**,​ care descrie execuția pas cu pas, **programarea orientată pe obiecte**, care modelează aplicația prin obiecte ce combină date și comportament,​ și **programarea funcțională**,​ care pune accent pe transformări de date, funcții pure și evitarea stării mutabile.
 +
 +Majoritatea limbajelor moderne sunt **multi-paradigmă**. Java, de exemplu, combină stilul imperativ și orientat pe obiecte cu elemente de programare funcțională (lambda expressions,​ Stream API), permițând alegerea paradigmei potrivite în funcție de problemă.
 +
 +<note tip>
 +Există mai multe tipuri de paradigme de programare:
 +  * programare imperativă (ex. C, Fortran)
 +  * programare orientată pe obiecte (ex. Java, C#, C++, Python)
 +  * programare funcțională (ex. Haskell, Lisp)
 +  * programare declarativă (ex. SQL, HTML)
 +  * programare logică (ex. Prolog)
 +  * programare bazată pe evenimente (ex. JavaScript)
 +</​note>​
 =====De ce am programa funcțional în Java?===== =====De ce am programa funcțional în Java?=====
  
Line 342: Line 362:
 isEven.test(10);​ // true isEven.test(10);​ // true
 </​code>​ </​code>​
 +
 +<note tip>
 +Predicate este util și pentru înlănțuirea condițiilor boolean prin folosirea metodelor ''​and(...)'',​ ''​or(...)'',​ ''​negate(...)''​.
 +<code java>
 +Predicate<​Integer>​ isPositive = x -> x > 0;
 +Predicate<​Integer>​ isEven = x -> x % 2 == 0;
 +
 +Predicate<​Integer>​ positiveAndEven =
 +    isPositive.and(isEven);​
 +
 +System.out.println(positiveAndEven.test(4)); ​ // true
 +System.out.println(positiveAndEven.test(3)); ​ // false
 +System.out.println(positiveAndEven.test(-2));​ // false
 +</​code>​
 +</​note>​
  
 ===Function<​T,​ R> – transformări=== ===Function<​T,​ R> – transformări===
Line 1287: Line 1322:
   * destinat serializării   * destinat serializării
  
 +====Optional<​T>​ vs. Optional Primitives====
 +
 +===Optional<​T>​===
 +
 +''​Optional<​T>''​ este varianta **generică**,​ care funcționează cu **orice tip obiect**.
 +
 +Caracteristici:​
 +  * folosește **tipuri obiect** (''​Integer'',​ ''​Double'',​ ''​String'',​ etc.)
 +  * implică **autoboxing** pentru tipurile primitive
 +  * este flexibil, dar **mai puțin eficient** pentru calcule numerice
 +
 +Exemplu:
 +<code java>
 +Optional<​Integer>​ max =
 +    numbers.stream()
 +           ​.max(Integer::​compareTo);​
 +
 +max.ifPresent(System.out::​println);​
 +</​code>​
 +
 +===OptionalInt/​OptionalLong/​OptionalDouble===
 +
 +''​OptionalInt''​ / ''​OptionalLong''​ și ''​OptionalDouble''​ sunt versiuni specializate pentru primitive.
 +
 +Caracteristici:​
 +  * lucrează direct cu ''​int''​
 +  * **nu folosește autoboxing**
 +  * mai **eficient** din punct de vedere al performanței
 +  * folosit în special împreună cu ''​IntStream''​
 +
 +Exemplu:
 +<code java>
 +OptionalInt max =
 +    numbers.stream()
 +           ​.mapToInt(x -> x)
 +           ​.max();​
 +
 +if (max.isPresent()) {
 +    System.out.println(max.getAsInt());​
 +}
 +</​code>​
 +
 +===Când folosim fiecare?===
 +
 +Folosește ''​Optional<​T>''​ când:
 +  * lucrezi cu **obiecte**
 +  * rezultatul vine dintr-un Stream<​T>​
 +  * tipul nu este numeric
  
 +Folosește ''​OptionalInt''​ când:
 +  * lucrezi cu **valori numerice primitive**
 +  * folosești ''​mapToInt''​
 +  * vrei cod **mai eficient** și **mai clar**
  
 =====[Optional] Parallel Streams===== =====[Optional] Parallel Streams=====
Line 1373: Line 1460:
   * [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​stream/​package-summary.html|Stream API - Oracle Docs]] ​   * [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​stream/​package-summary.html|Stream API - Oracle Docs]] ​
   * [[https://​www.baeldung.com/​java-functional-programming|Java Functional Programming - Baeldung]]   * [[https://​www.baeldung.com/​java-functional-programming|Java Functional Programming - Baeldung]]
 +  * [[https://​www.baeldung.com/​java-optional|Guide to Java Optional - Baeldung]]
  
  
poo-ca-cd/laboratoare/programare-functionala-lambda-si-streamuri.1765789932.txt.gz · Last modified: 2025/12/15 11:12 by florian_luis.micu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0