This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:clase-interne [2022/11/15 23:18] ioan.oporanu [Exerciții] |
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 140: | Line 140: | ||
- | <note important>Clasele interne anonime declarate în metode pot folosi variabilele declarate în metoda respectivă și parametrii metodei dacă aceștia sunt //final// sau **//effectively final//**. Dacă o variabilă nu e declarată final dar nu se modifică schimbă după inițializare, atunci este [[https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class|effectively final]]. | + | <note important>Clasele interne anonime declarate în metode pot folosi variabilele declarate în metoda respectivă și parametrii metodei dacă aceștia sunt //final// sau **//effectively final//**. Dacă o variabilă nu e declarată final dar nu se modifică după inițializare, atunci este [[https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class|effectively final]]. |
Variabilele si parametrii metodelor se află pe segmentul de stivă din memorie creat pentru metoda respectivă, ceea ce face ca ele să nu existe la fel de mult cât clasa internă. Dacă variabila este declarată ''final'', atunci la runtime se va stoca o copie a acesteia ca un câmp al clasei interne, în acest mod putând fi accesată și după execuția metodei. | Variabilele si parametrii metodelor se află pe segmentul de stivă din memorie creat pentru metoda respectivă, ceea ce face ca ele să nu existe la fel de mult cât clasa internă. Dacă variabila este declarată ''final'', atunci la runtime se va stoca o copie a acesteia ca un câmp al clasei interne, în acest mod putând fi accesată și după execuția metodei. | ||
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. | + | |
Line 417: | Line 437: | ||
-Pret: 35000, An: 2015; | -Pret: 35000, An: 2015; | ||
-Fiat: | -Fiat: | ||
- | -Pret: 3000, An: 2008; | + | -Pret: 3500, An: 2008; |
-Pret: 7000, An: 2010; | -Pret: 7000, An: 2010; | ||
-Skoda: | -Skoda: | ||
- | -Pret: 3500, An: 2010; | + | -Pret: 12000, An: 2015; |
- | -Pret: 7000, An: 2010; | + | -Pret: 25000, An: 2021; |
* Creati un obiect de tip Dealership. | * Creati un obiect de tip Dealership. |