Changes

Jump to: navigation, search

Java Funkcionális interfész & Lambda

2,445 bytes added, 09:53, 12 August 2022
Constructor Reference
A konstruktor referencia egy speciális Metódus referencia, ami csavar még egyet a fenti metódus referencia koncepción, itt már nagyon kell figyelni. <br>
Ugyebár minden funkcionális IF visszaad egy objektumot, és vagy kap vagy nem input paramétereket. A lényeg, hogy egy előre nem definiált módon gyártson le egy olyan objektumot, amit visszaad akkor mikor meghívjuk a funkcionális metódusát, az előbbi példában az '''R apply(T)''' metódust. Ahol kap egy T-t és tök mindegy hogy hogy, csak gyártson le egy '''R''' osztály példányt.
 
 
Tekintsük az alábbi funkcionális IF-et:
<source lang="java">
@FunctionalInterface
public interface MyFunction {
 
MyString process(String input);
}
</source>
 
Bármi is legyen az implementáció (impl osztállyal vagy inline lambda kifejezéssel) a lényeg, hogy előállítson a MyString objektumot. <br>
A konstruktor referencia lehetővé teszi, hogy a funkcionális IF implementációt egy osztály konstruktorával helyettesítsük be. Vagyis a funkcionális metódus visszatérési objektumát úgy állíts elő, hogy szimplán példányosítsd a megadott osztályt, jelen esetben a MyString-et. Az osztálynak rendelkeznie kell egy olyan konstruktorral, ami a funkcionális metódus input paramétereivel megegyezik. A fenti esetben tehát akkor fogjuk tudni a MyString -et konstruktor referenciában használni, ha rendelkezik egy olyan konstruktorral, ami String-et vár.
 
pl:
<source lang="java">
public class MyString {
 
private String input;
 
public MyString(String input) {
this.input = input;
}
 
public String getInput() {
return input;
}
}
</source>
 
 
A konstruktor referenciát '''::new''' -val kel megadni, vagy a '''::'' operátor után a '''new''' kulcsszót kell írni. Egy lehetséges példa:
 
Tegyük fel, hogy van egy java osztályunk, amiben van egy metódus, ami felhasználja a '''MyFunction''' funkcionális if-et:
<source lang="java">
public class MyLambadClass {
 
private String variable1;
 
public MyLambadClass(String a) {
this.variable1 = a;
}
 
public void processVariable2(MyFunction mf) {
 
MyString myString = mf.process(variable1);
 
System.out.println("MyString instance created by function if call: "+ myString.getInput());
}
}
</source>
Vagyis azt mondja meg, hogy vagy a MyFunction implementálásával vagy egy inline lambda kifejezéssel gyártsunk olyan kódot, ami a saját osztály String változóját (varibale1) átalakítja egy MyString osztállyá, amit ő aztán fel tud használni a metódusban (jelen esetben kiíratjuk).
 
 
És ahelyett hogy:
* Implementációt készítünk a MyFunction-hez
* lambda kifejezésben adjuk meg inline
* Metódus referenciát használunk egy olyan osztály metódusával, ami String-et vár és gyárt belőle egy MyString-et
 
Simán megfogjuk a MyString osztályt és a konstruktorára hivatkozunk a '''MyLambadClass.processVariable2(..)''' metódus használatakor.
<br>
 
==Constructor reference in Enum==
Ehhez elsőként ajánlott elolvasni az ENUM alapokat: [[ Java Enum]]

Navigation menu