A Double Colon Operator a Java 8-ban
1. Áttekintés
Ebben a rövid cikkben megvitatjuk a kettős vastagbél operátor ( :: ) a Java 8-ban, és nézze át azokat a forgatókönyveket, ahol az operátor használható.
2. A Lambdas-tól a Double Colon Operatorig
Lambdas kifejezésekkel láttuk, hogy a kód nagyon tömör lehet.
Például hozzon létre összehasonlítót, a következő szintaxis elég:
C) összehasonlító = (Computer c1, Computer c2) -> c1.getAge (). CompareTo (c2.getAge ());
Ezután a típus következtetésével:
C = (c1, c2) -> c1.getAge (). Összehasonlító (c2.getAge ());
De vajon a fenti kódot még kifejezőbbé és olvashatóbbá tehetjük-e? Nézzük meg:
C összehasonlító = összehasonlító.összehasonlítás (számítógép :: getAge);
Felhasználtuk a :: operátor rövidítésként lambdák számára, amelyek egy meghatározott módszert hívnak - név szerint. És a végeredmény természetesen még olvashatóbb szintaxis.
3. Hogyan működik?
Nagyon egyszerűen fogalmazva, ha módszer referenciát használunk - a cél referencia a határoló elé kerül :: és a módszer nevét megadjuk utána.
Például:
Számítógép :: getAge;
Megvizsgáljuk a módszerre való hivatkozást getAge meghatározta a Számítógép osztály.
Ezután működhetünk ezzel a funkcióval:
Függvény getAge = számítógép: getAge; Egész számítógép computerge = getAge.apply (c1);
Figyelje meg, hogy hivatkozunk a függvényre - majd a megfelelő típusú argumentumra alkalmazzuk.
4. Módszer hivatkozások
Ezt az operátort jó néhány esetben jól használhatjuk.
4.1. Statikus módszer
Először ki fogjuk használni statikus hasznossági módszer:
Listajegyzék = Arrays.asList (új számítógép (2015, "fehér", 35), új számítógép (2009, "fekete", 65)); invent.forEach (ComputerUtils :: javítás);
4.2. Egy létező objektum példánymódszere
Ezután vessünk egy pillantást egy érdekes forgatókönyvre - hivatkozás egy létező objektumpéldány metódusára.
A változót fogjuk használni Rendszer.ki - típusú objektum PrintStream amely támogatja a nyomtatás módszer:
C1 számítógép = új számítógép (2015, "fehér"); Computer c2 = new Computer (2009, "fekete"); Computer c3 = new Computer (2014, "fekete"); Arrays.asList (c1, c2, c3) .forEach (System.out :: print);
4.3. Egy adott típusú önkényes objektum példánymódszere
C1 számítógép = új számítógép (2015, "fehér", 100); Computer c2 = új MacbookPro (2009, "fekete", 100); List list = Arrays.asList (c1, c2); invent.forEach (Számítógép :: turnOnPc);
Mint láthatja, a turnOnPc metódus nem egy adott példányra, hanem magára a típusra.
A 4. sorban a példány metódus turnOnPc minden objektumára meghívásra kerül leltár.
És ez természetesen azt jelenti - a c1 a módszer, a metódus turnOnPc hívják a Számítógép például és c2 tovább MacbookPro példa.
4.4. Egy adott objektum szuper módszere
Tegyük fel, hogy a következő módszer van a Számítógép szuperosztály:
public Dupla calcValue (Double initialValue) {return initialValue / 1,50; }
és ez befelé MacbookPro alosztály:
@ A nyilvános kettős kiszámításának felülbírálása (dupla kezdőérték) {Funkció függvény = szuper :: számítás értéke; Dupla pcValue = function.apply (kezdeti érték); return pcValue + (kezdeti érték / 10); }
Felhívás calcValue módszer a MacbookPro példa:
macbookPro.calculateValue (999,99);
felhívást is kezdeményez calcValue a Számítógép szuperosztály.
5. Konstruktori referenciák
5.1. Hozzon létre egy új példányt
A konstruktorra való hivatkozás egy objektum példányosítására meglehetősen egyszerű lehet:
@FunctionalInterface nyilvános felület InterfaceComputer {Computer create (); } InterfaceComputer c = Számítógép :: új; Számítógépes számítógép = c.create ();
Mi van, ha két paramétered van egy konstruktorban?
BiFunction c4Function = Számítógép :: új; Számítógép c4 = c4Function.apply (2013, "fehér");
Ha a paraméter három vagy több, akkor meg kell határoznia egy új funkcionális interfészt:
@FunctionalInterface interfész TriFunction {R alkalmazható (A a, B b, C c); alapértelmezett TriFunction andThen (Function after) {Objects.requireNonNull (után); visszatérés (A a, B b, C c) -> után. alkalmazás (alkalmazza (a, b, c)); }}
Ezután inicializálja az objektumot:
TriFunction c6Function = Computer :: new; C3 számítógép = c6Function.apply (2008, "fekete", 90);
5.2. Hozzon létre egy tömböt
Végül nézzük meg, hogyan hozhatunk létre egy tömböt Számítógép öt elemű objektumok:
Funkció computerCreator = Számítógép [] :: új; Számítógép [] computerArray = computerCreator.apply (5);
6. Következtetés
Amint látni kezdjük, a Java 8-ban bevezetett kettős kettőspont operátor nagyon hasznos lesz bizonyos esetekben, különösen a Streamekkel együtt.
Az is nagyon fontos, hogy megnézzük a funkcionális interfészeket, hogy jobban megértsük, mi történik a színfalak mögött.
A teljes forráskód a példa ebben a GitHub projektben érhető el - ez egy Maven és Eclipse projekt, így importálható és használható.