7,540
edits
Changes
→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>
<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===