Changes

Java Funkcionális interfész & Lambda

2,263 bytes added, 16:02, 18 August 2022
lambda kifejezésben adjuk meg inline
===lambda kifejezésben adjuk meg inline===
Az vetődhet fel kapásból bennünk, hogy az itt lambda-val definiált funkcionális if implementáció (vagyis a 'MyString process(String) impl') mikor fog lefutni, ki fogja meghívni, és mi lesz az a String érték amin dolgozni fog. A korábbi példákban mindig volt egy akármilyen metódus, ami várta paraméterül a funkcionális if-et, majd meghívta rajta a funkcionális metódusát (jelen esetben a process(Stringt)-et), úgy, hogy az a bizonyos metódus töltötte fel az összes input paraméterrel a funkcionális if hívást. Pszeudó kóddal ez már működő képeselvi szinten így néz ki amiről itt beszélek: <source lang="java">class MyClassUsingFunctionIF {  void myMethodUsingFunctionIF(MyFunction mf) {  String inputForFuncion = "this is the input"; MyString result = mf.process(inputForFunction); }}</source>Itt a 'myMethodUsingFunctionIF(..)' meghívásával tudjuk implicit lefuttatni a funkcionális if implementációt. A process(..) input paraméterét saját belső változójából tölti fel.  ENUM konstruktor referencia estében el kell kérni az enum-tol a konstruktorban inicializált funkcionális függvényt, és meg kell hívni a funkcionális interfészét úgy hogy feltöltjük azt a megfelelő paraméterekkel. Nézzük ezt részletesen.Az alábbi példában az enum konstruktorában egy 'MyFunction' funkcionális interfészt kell átadni, amit egy inline lambda kifejezéssel definiáltunk (mármint a process metódusát):
<source lang="java">
public enum MyEnum2 {
;
</source>
 {note||Az itt megadott kód ugyebár nem fog lefutni a a MyEnum2 példányosításakor. A példányosításkor a konstruktorban ezzel a lambda kifejezéssel csak megadott megadtuk a MyFunction if tervrajzát, vagyis hogy a MyFunction osztály változó rakjon bele egy olyan "virtuális" implementációs példányt, amiben az itt megadott 'MyString process(String)' implementáció található. Tehát }}  Ahhoz hogy a 'process(String)'-et implementáló lambdakifejezésünk lefusson, elsőként példányosítani kell az ENUM-ban megadott kód rész csak akkor fog lefutniot a megfelelő típusra, arra, ha meghívjuk explicit ami a MyFunctionlambda kifejezést tartalmazza, ami nem más mint az '''ENUMV1''' (lehetne több értéke is az enum-nak, és mindegyikben más és más implementációt is megadhattunk volna).Majd a példányosított enmum-tól a getter-el el kell kérni a funkcionális IF osztály változót, aminek meg kell hívni a process(..) metódustmetódusát, így: úgy hogy megadjuk az if-en kötelező egy darab String input paramétert.  
<source lang="java">
System.out.println("START");
 
MyEnum2 myEnum21 = MyEnum2.ENUMV1;
System.out.println("Enum was created"); MyString result = myEnum21.getFunction().process("process input"); <<---- itt fut csak le a konstruktorban megadott lambda
</source>
Ekkor az írja Nézzük meg futási sorrendet, ezt logolja az stdout-ra: . Látható, hogy a lambda-ba megadott kifejezés csak a 'process(..)' metódus meghívásakor futott le. A lambda kifejezés tartalmazott egy 'MyString' példányosítást, az futott le utoljára.
<pre>
START
ENUM constructor is called with input
Enum was created
ENUM lambda is called with input: process input
MyString consturctor is called with input:process input
<br>
<br>
 
===Metódus referenciát használunk===