Changes

Java Funkcionális interfész & Lambda

494 bytes added, 15:03, 19 August 2022
Hogyan működik
<br>
<br>
A fent leírtakat persze persze anonymus anonymous osztályokkal is el lehet érni, csak többet kell hozzá írni. Pl: A Theread osztályban szokásos anonimusz anonymous osztályokat létrehozni a run() definiálására:
<source lang="java">
 
public class AnonymousClassExample {
}
}
</source>
<br>
<br>
</source>
Nézzük át milyen módon lehet felhasználni ezt Egy funkcionális interfész implementációjának a funkcionális IF-etmegadására az alábbi 5 lehetőségünk van: * Hagyományos implementációs osztály példányosítása* anonymous osztály használata* Lambda kifejezés használata* Metódus referencia használata: lásd [[#Java_Method_Reference_and_Constructor_Reference]]* Konstruktor referencia használata lásd [[#Java_Method_Reference_and_Constructor_Reference]]<br><br>
===Implementációs osztály példányosítása===
A klasszikus használata egy interfésznek, ha készítünk egy osztályt, ami implementálja az absztrakt metódusokat, majd példányosítjuk az osztályt, és klasszikus módon használjuk. Ehhez nincs szükség funkcionális IF-re, vagyis hogy csak egy absztrakt metódusa legyen az interfésznek, mivel az implementációban explicit megmondjuk, hogy melyiket implementáljuk:
<br>
<br>
===Anonimus Anonymous osztály használata===Ahogy a bevezetőben is láttuk, bármilyen interfésznek lehet anonimus anonymous osztállyal definiálni a még nem definiált interfészeit az alábbi szintaxissal:
<pre>
new InterfaceName() {
<br>
===Lambada kifejezés használata===
A fenti anonimus anonymous osztály definíció egy sokkal rövidebb Lambda kifejezéssel kiváltható, de csak akkor ha a szóban forgó interfész egy '''funkcionális interfész''', vagyis pontosan egy darab absztrakt metódusa van. A Lambda kifejezés szintaxisa az alábbi:
<pre>
(arguments) -> {function body}
</pre>
Ahol az argomentumok argumentumok az egy szem absztrakt metódus input paraméterei, a function bdoy-ban pedig leírjuk, hogy mit tegyen ezekkel az input paraméterekkel az implementáció. Az argumentumok típus nélküliek, a típusuk implicit következik a felhasználási módból, lásd lentebb.
* A paraméterek neve tetszőleges lehet, nem kell megegyezzen a funkcionális metódus paraméter neveivel. A sorrend viszont számít. A lényeg, hogy a body-ban az argumentumokban felsorolt nevekkel tudunk hivatkozni az input paraméterekre.
* Ha az interfész input paraméter generikus, csak akkor fognak típust kapni, amikor a generikus értékeket definiáljuk az interfész változó létrehozásánál.
=Lambda használati példák =
...TODO... ==Tipikus használati minták==
---> innen lefele minden törlendő ebből ..TODO: mindig egy metódus beljesében van, és a fejezetből ---metódus lambda-<t vár input paraméterben, és az osztály belsejében lévő változókkal szokott operálni. ...
<br><br>
==List-forEach()==
<br>