This shows you the differences between two versions of the page.
|
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]] | ||