Date: Thu, 28 Mar 2024 22:45:27 +0000 (UTC) Message-ID: <724126853.5175.1711665927528@localhost4> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_5174_1396912192.1711665927526" ------=_Part_5174_1396912192.1711665927526 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
A Java 8 egyik =E2=80=93 illetve a Project Jigsaw elkasz=C3=A1l= =C3=A1sa =C3=B3ta az egyetlen =E2=80=93 nagy =C3=BAj=C3=ADt=C3=A1sa a = Lambda expressions be=C3=A9p=C3=ADt=C3=A9se a nyelvi eszk=C3=B6z=C3=B6k k= =C3=B6z=C3=A9.
El=C5=91sz=C3=B6r =C3=A9rdemes tiszt=C3=A1zni, hogy mi is az a Lambda ex= pression: a magyar szakmai nyelvbe a funkcion=C3=A1lis nyelvekkel egy=C3=BC= tt ker=C3=BClt be a lambda-kalkulus elnevez=C3=A9s, amely lehet=C5=91v=C3= =A9 teszi, hogy param=C3=A9terk=C3=A9nt f=C3=BCggv=C3=A9nyt lehessen =C3=A1= tadni egy met=C3=B3dus h=C3=ADv=C3=A1s=C3=A1n=C3=A1l, ezzel egyszer=C5=B1bb= en lehet le=C3=ADrni azt a feladatot, amelyet eddig a n=C3=A9v n=C3=A9lk=C3= =BCli bels=C5=91 oszt=C3=A1lyokkal oldottunk meg (anonymous inner class). L= =C3=A1ssunk egy klasszikus p=C3=A9ld=C3=A1t, egy list=C3=A1t szeretn=C3=A9n= k rendezni egy Comparable interf=C3=A9szt kiterjeszt=C5=91 saj=C3=A1t oszt= =C3=A1llyal.
Az els=C5=91 megold=C3=A1s mutatja a teljes programot, amely egy lista e= lemeit =E2=80=93 az egyszer=C5=B1s=C3=A9g kedv=C3=A9=C3=A9rt =E2=80=93= =C3=B6sszekever:
public c= lass LambdaRunExample { private static final Random random =3D new Random(); public static void main(String[] args) { List<String> list =3D new ArrayList<String>(); list.add("a"); list.add("ab"); list.add("abc"); list.add("abcd"); list.add("abdce"); Collections.sort(list, new Comparator<String>() { public int compare(String o1, String o2) { return random.nextInt(); } }); System.out.println(list); } }=20
M=C3=B3dos=C3=ADtsuk a programot a Lambda expressions szab=C3=A1lyai sze= rint:
public c= lass LambdaRunExample { private static final Random random =3D new Random(); public static void main(String[] args) { List<String> list =3D new ArrayList<String>(); list.add("a"); list.add("ab"); list.add("abc"); list.add("abcd"); list.add("abdce"); Collections.sort(list, (o1, o2) -> random.nextInt()); System.out.println(list); } }=20
Ford=C3=ADtsuk le egy Java 8 JDK haszn=C3=A1lat=C3=A1val:
> ./= jdk1.8.0/bin/javac -version javac 1.8.0-ea > ./jdk1.8.0/bin/javac LambdaRunExample.java > ./jdk1.8.0/bin/java LambdaRunExample [a, abc, abdce, ab, abcd]=20
Vess=C3=BCnk egy pillant=C3=A1st a k=C3=A9t megold=C3=A1s l=C3=A9nyegi r= =C3=A9szeit illet=C5=91 k=C3=BCl=C3=B6nbs=C3=A9gekre:
Collecti= ons.sort(list, new Comparator<String>() { public int compare(String o1, String o2) { return random.nextInt(); } });=20
versus
Collecti= ons.sort(list, (o1, o2) -> random.nextInt());=20
Ez=C3=A9rt fogjuk szeretni a Lambda expressions haszn=C3=A1lat=C3=A1t, b= =C3=A1r szoknia kell a Java ut=C3=B3bbi 10 =C3=A9v=C3=A9hez szokott szemnek= az ilyen sorokat, de meg lehet tanulni, ahogy az annot=C3=A1ci=C3=B3kat = =C3=A9s a generics-et is megtanultuk...
A Comparator ide=C3=A1lis =C3=A1llatorvosi l=C3=B3, mert nagyszer=C5=B1e= n meg lehet rajta mutatni a lehet=C5=91s=C3=A9get, de term=C3=A9szetesen m= =C3=A1s oszt=C3=A1lyok =C3=A9s met=C3=B3dusok is vannak, amelyek meg fogj= =C3=A1k k=C3=B6nny=C3=ADteni az =C3=A9let=C3=BCnket, l=C3=A1ssunk ebb=C5=91= l is n=C3=A9h=C3=A1nyat a teljess=C3=A9g ig=C3=A9nye n=C3=A9lk=C3=BCl:
Hasznos funkci=C3=B3 lehet egy list=C3=A1b=C3=B3l lesz=C5=B1rni bizonyos= elemeket, p=C3=A9ld=C3=A1ul a h=C3=A1rom karaktern=C3=A9l hosszabb sz=C3= =B6vegeket:
Iterabl= e<String> filtered =3D list.filter( item -> item.length() <=3D = 3 ); System.out.println(filtered);=20
Eredm=C3=A9ny=C3=BCl megkapjuk a r=C3=B6vid listaelemeket:
[a, ab,= abc]=20
A lista elem=C3=A9b=C5=91l egy =C3=BAj list=C3=A1t k=C3=A9sz=C3=ADthet= =C3=BCnk, p=C3=A9ld=C3=A1ul lista elemeinek a hossz=C3=A1t szeretn=C3=A9nk = megkapni eredm=C3=A9ny=C3=BCl:
Iterabl= e<Integer> lengths =3D list.map( item -> item.length() ); System.out.println(lengths);=20
[1, 2, = 3, 4, 5]=20
A lista elemeit egy elemm=C3=A9 tudjuk reduk=C3=A1lni, a reduk=C3=A1l=C3= =A1s m=C5=B1velet=C3=A9t tudjuk meghat=C3=A1rozni, p=C3=A9ld=C3=A1ul adjuk = =C3=B6ssze a fentebb kialakult lista elemeit:
Integer= sum =3D lengths.reduce(0, (left, right) -> left + right); System.out.println(sum);=20
Az els=C5=91 =C3=A9rt=C3=A9k az, ami az els=C5=91 left lesz, am= elyhez hozz=C3=A1adjuk a lista els=C5=91 elem=C3=A9t, majd a kapott =C3=A9r= t=C3=A9kkel v=C3=A9gigiter=C3=A1lunk a list=C3=A1n, =C3=ADgy az eredm=C3=A9= ny 15 lesz:
15=20
V=C3=A9gig tudunk iter=C3=A1lni egy lista elemein, =C3=ADgy p=C3=A9ld=C3= =A1ul =C3=B6ssze tudjuk f=C5=B1zni a lista tartalm=C3=A1t egy sz=C3=B6vegg= =C3=A9:
StringB= uilder sb =3D new StringBuilder(); list.forEach( item -> { sb.append(item).append(' '); } ); System.out.println(sb);=20
Az eredm=C3=A9ny term=C3=A9szetesen:
a ab ab= c abcd abdce=20
...
A lehet=C5=91s=C3=A9gek t=C3=A1rh=C3=A1za "v=C3=A9gtelen"...
A gy=C3=A1ri Lambda expressions vonz=C3=B3 lehet=C5=91s=C3=A9g,= de ez a j=C3=A1t=C3=A9k sokkal =C3=A9rdekesebb saj=C3=A1t f=C3=BCggv=C3=A9= nyt=C3=B6rzsekkel, s ha l=C3=A9trehozunk saj=C3=A1t Lambda expressions-=C3= =B6n alapul=C3=B3 megold=C3=A1sokat, akkor jobban meg=C3=A9rtj=C3=BCk a m= =C5=B1k=C3=B6d=C3=A9s=C3=A9t is.
El=C5=91sz=C3=B6r is sz=C3=BCks=C3=A9g=C3=BCnk van egy interf=C3=A9szre,= amelyb=C5=91l majd Lambda expressions lesz, legyen a p=C3=A9lda egy sz=C5= =B1r=C5=91, amely a kapott objektum =C3=A9rt=C3=A9ke szerint majd egy igaz = vagy egy hamis v=C3=A1laszt ad:
public i= nterface Filter<T> { boolean filter(T o1); }=20
Ezek ut=C3=A1n a fentebb m=C3=A1r elk=C3=A9sz=C3=ADtett LambdaRunExa= mple.java =C3=A1llom=C3=A1nyban hozzunk l=C3=A9tre egy met=C3=B3dust, = amely majd elv=C3=A9gzi a sz=C5=B1r=C3=A9st:
public s= tatic <T> void applyFilter(List<T> list, Filter<? super T>= ; f) { List<T> removeFromList =3D new ArrayList<T>(); for (T item : list) { if (f.filter(item)) { removeFromList.add(item); } } list.removeAll(removeFromList); }=20
Amint l=C3=A1tjuk, a met=C3=B3dus m=C3=A1sodik param=C3=A9terek=C3=A9nt = egy Filter interf=C3=A9szt implement=C3=A1l=C3=B3 oszt=C3=A1ly egy= p=C3=A9ld=C3=A1ny=C3=A1t szeretn=C3=A9nk megkapni, amelyet a for each<= /em> ciklusban haszn=C3=A1lunk fel, ahol a kapott item p=C3=A9ld= =C3=A1nyr=C3=B3l d=C3=B6ntj=C3=BCk el, hogy ki kell-e sz=C5=B1rn=C3=BCnk a = list=C3=A1b=C3=B3l vagy sem.
A l=C3=A9nyegi r=C3=A9sz =E2=80=93 maga a Lambda expression =E2=80= =93 a Collections.sort met=C3=B3dushoz hasonl=C3=B3an =C3=A9p=C3=BCl fel, e= gyszer=C5=B1en megadjuk azt a felt=C3=A9telt, amely szerint a sz=C5=B1r=C3= =A9st el szeretn=C3=A9nk v=C3=A9gezni, jelen esetben a h=C3=A1rom karaktern= =C3=A9l hosszabb sz=C3=B6vegeket az applyFilter met=C3=B3dus el fo= gja t=C3=A1vol=C3=ADtani a list=C3=A1b=C3=B3l:
LambdaRu= nExample.applyFilter(list, (item) -> item.length() > 3);=20
Felmer=C3=BCl a k=C3=A9rd=C3=A9s, hogy a ford=C3=ADt=C3=A1skor honnan tu= dja a ford=C3=ADt=C3=B3, hogy melyik met=C3=B3dusr=C3=B3l van sz=C3=B3, s e= z a k=C3=A9rd=C3=A9s a Lambda expressions l=C3=A9nyege...
Rontsuk el a Filter interf=C3=A9szt, adjuk hozz=C3=A1 egy =C3= =BAj met=C3=B3dust:
public i= nterface Filter<T> { boolean filter(T o1); boolean anotherFilter(T o1); }=20
A LambdaRunExample.java oszt=C3=A1lyt leford=C3=ADtva r=C3=B6gt= =C3=B6n bes=C3=ADr a javac, hogy nem tudja eld=C3=B6nteni, mit is = szeretn=C3=A9k t=C5=91le, mert az =C3=A1tadott interf=C3=A9szben t=C3=B6bb = olyan met=C3=B3dus is van, amelyet haszn=C3=A1lhatna:
LambdaR= unExample.java:19: error: method applyFilter in class LambdaRunExample cann= ot be applied to given types; LambdaRunExample.applyFilter(list, (item) -> item.length() > 3); ^ required: List<T>,Filter<? super T> found: List<String>,lambda reason: multiple non-overriding abstract methods found in interface Filte= r where T is a type-variable: T extends Object declared in method <T>applyFilter(List<T>,= Filter<? super T>) 1 error=20
Sz=C3=B3val el=C3=A9gedj=C3=BCnk meg egy darab met=C3=B3dussal azon inte= rf=C3=A9szeinkben, amelyeket szeretn=C3=A9nk a fenti m=C3=B3don haszn=C3=A1= lni...
Lambda expressions: http://jdk8.java.net/lambda/