This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:clase-interne [2024/11/10 16:43] silvia_elena.nistor |
poo-ca-cd:laboratoare:clase-interne [2024/12/15 14:12] (current) maria.enescu [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 6: Clase interne ===== | + | ===== Laboratorul 10: Clase interne. Lambda expresii. ===== |
**Video introductiv:** [[https://youtu.be/KIyaRwog3q8| link ]] | **Video introductiv:** [[https://youtu.be/KIyaRwog3q8| link ]] | ||
Line 153: | Line 153: | ||
Când veți scrie o clasă anonimă într-un IDE cum e IntelliJ, veți primi un warning care vă recomandă să o transformați într-o lambda. Aceasta recomandare este valabilă doar pentru implementarea claselor/interfețelor cu o singură metoda. | Când veți scrie o clasă anonimă într-un IDE cum e IntelliJ, veți primi un warning care vă recomandă să o transformați într-o lambda. Aceasta recomandare este valabilă doar pentru implementarea claselor/interfețelor cu o singură metoda. | ||
- | Lambda este un concept din programarea funcțională (o să îl învățați în semestrul 2 la Paradigme de Programare) și reprezintă o funcție anonimă. Majoritatea limbajelor de nivel înalt au introdus suport pentru acest concept în ultimii 15 ani, inclusiv Java, din versiunea 8. | + | Lambda este un concept din **programarea funcțională** (o să îl învățați în semestrul 2 la Paradigme de Programare) și reprezintă o funcție anonimă. Majoritatea limbajelor de nivel înalt au introdus suport pentru acest concept în ultimii 15 ani, inclusiv Java, din versiunea 8. |
Line 166: | Line 166: | ||
</code> | </code> | ||
- | În codul de mai sus declararea clasei anonime și suprascrierea metodei din getFuelCapacity() a fost înlocuită cu o expresie lambda. O altă situație des intalnită de folosire a lambda-urilor este pentru transmiterea de funcții ca parametru iar api-uri precum cel de filtrare al colecțiilor le utilizează intens ([[https://www.baeldung.com/java-stream-filter-lambda|exemplu]]). | + | În codul de mai sus declararea clasei anonime și suprascrierea metodei din getFuelCapacity() a fost înlocuită cu o expresie lambda. O altă situație des intalnită de folosire a lambda-urilor este pentru **transmiterea de funcții ca parametru** iar api-uri precum cel de filtrare al colecțiilor le utilizează intens ([[https://www.baeldung.com/java-stream-filter-lambda|exemplu]]). |
În exemplul de mai jos aveți niște exemple simple de folosire lambda ca paremetru pentru metode. Parametrii primiți în lambda pot fi zero (//()// ca în exemplul cu fuelCapacity) sau mai mulți (param1, param2, ...). | În exemplul de mai jos aveți niște exemple simple de folosire lambda ca paremetru pentru metode. Parametrii primiți în lambda pot fi zero (//()// ca în exemplul cu fuelCapacity) sau mai mulți (param1, param2, ...). | ||
Line 182: | Line 183: | ||
</code> | </code> | ||
- | Operatorul [[https://www.geeksforgeeks.org/double-colon-operator-in-java/|::]] este folosit pentru referințierea metodelor. | + | **Operatorul [[https://www.geeksforgeeks.org/double-colon-operator-in-java/|::]]** este folosit pentru referințierea metodelor. |
+ | |||
+ | Putem folosi funcții anonime pentru a executa diverse **operații pe liste** (de exemplu ''removeIf'', care filtrează elementele unei colecții pe baza unui predicat, și ''replaceAll'', care aplică o operație pe toate elementele unei colecții). | ||
- | O să mai oferim exemple și detalii despre lambdas și în laboratoarele următoare, de exemplu cel cu [[poo-ca-cd:laboratoare:colectii|Colecții]] sau cel pentru concepte din [[poo-ca-cd:laboratoare:java-features|Java 8]]. | + | Exemple: |
+ | <code java> | ||
+ | List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); | ||
+ | // incrementează toate numerele din colecție cu 1 | ||
+ | list.replaceAll((x) -> x + 1); | ||
+ | |||
+ | // șterge din colecție numerele impare | ||
+ | list.removeIf((x) -> x % 2 == 1); | ||
+ | </code> | ||
+ | |||
+ | O altă utilitate a funcțiilor anonime reprezintă în **implementarea comparatorilor** folosiți la sortare sau la crearea de colecții sortate (TreeSet, TreeMap). | ||
+ | |||
+ | Exemple: | ||
+ | <code java> | ||
+ | // o variantă | ||
+ | Collections.sort(list, (o1, o2) -> o2 - o1); | ||
+ | |||
+ | // alta variantă, prin care se folosim de metoda sort() din interfața List | ||
+ | list.sort((o1, o2) -> o2 - o1); | ||
+ | |||
+ | // colecții sortate | ||
+ | TreeSet<Integer> sortedSet = new TreeSet<>((o1, o2) -> o1 - o2); | ||
+ | TreeMap<Integer, Integer> sortedMap = new TreeMap<>((o1, o2) -> o1 - o2); | ||
+ | </code> | ||
====Clase interne statice==== | ====Clase interne statice==== | ||
Line 357: | Line 383: | ||
} | } | ||
});</code> | });</code> | ||
- | ==== Exerciții ==== | + | ==== Exerciții ==== |
- | /***Task 1 - Meta** (4p) | + | |
- | Îndrumarul este o componentă importantă a laboratorului de POO, iar citirea și înțelegerea acestuia nu trebuie neglijate. În îndrumarul din acest laborator există mai multe căsuțe de tip **note**, de forma celei de mai jos: | + | Exercițiile din acest laborator au ca scop simularea obținerii prețului unei mașini de la un dealer. Construcția obiectelor necesare o veți face de la zero conform instrucțiunilor din taskuri. |
- | <note> Do stuff </note> | + | <note important> |
- | + | Pentru a încărca soluția, va trebui să accesați link-ul https://code.devmind.ro/login, să intrați pe tab-ul Contests, unde veți găsi laboratorul grupei voastre. | |
- | Identificați toate căsuțele de tip **note** din laborator și urmați instrucțiunile din acestea. Puteți folosi scheletul pus la dispoziție. Pentru a ușura procesul de evaluare, creați fișiere separate pentru fiecare task din **note**. | + | </note> |
- | */ | + | |
- | + | ||
- | **Schelet de laborator**: [[https://github.com/oop-pub/oop-labs/tree/master/src/lab6|Laborator6]] | + | |
- | + | ||
- | Exercițiile din acest laborator au ca scop simularea obținerii prețului unei mașini de la un dealer. Construcția obiectelor necesare o veți face de la zero conform instrucțiunilor din taskuri. | + | |