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ó.