Operator dvostrukog kolona u Javi 8

1. Pregled

U ovom kratkom članku razgovarat ćemo o operater dvostrukog debelog crijeva ( :: ) u Javi 8 i pregledajte scenarije u kojima se operator može koristiti.

2. Od Lambdasa do operatora dvostrukog kolona

S Lambdas izrazima vidjeli smo da kod može postati vrlo sažet.

Na primjer, do stvoriti komparator, dovoljna je sljedeća sintaksa:

Usporednik c = (Računalo c1, Računalo c2) -> c1.getAge (). CompareTo (c2.getAge ()); 

Zatim, s zaključivanjem tipa:

Usporednik c = (c1, c2) -> c1.getAge (). CompareTo (c2.getAge ());

Ali možemo li gore navedeni kod učiniti još izražajnijim i čitljivijim? Pogledajmo:

Usporednik c = Comparator.comparing (Computer :: getAge); 

Koristili smo :: operator kao skraćenica za lambdaste pozive određene metode - imenom. I na kraju, rezultat je naravno još čitljivija sintaksa.

3. Kako to djeluje?

Vrlo jednostavno, kada koristimo referencu metode - ciljna referenca stavlja se ispred graničnika :: a naziv metode naveden je nakon nje.

Na primjer:

Računalo :: getAge;

Gledamo referencu na metodu getAge definirano u Računalo razred.

Tada možemo raditi s tom funkcijom:

Funkcija getAge = Računalo :: getAge; Cijeli broj computerAge = getAge.apply (c1); 

Primijetite da referenciramo funkciju - a zatim je primjenjujemo na pravu vrstu argumenta.

4. Reference o metodama

Ovog operatora možemo dobro iskoristiti u dosta scenarija.

4.1. Statička metoda

Prvo ćemo se poslužiti statička korisna metoda:

Popis inventara = Arrays.asList (novo Računalo (2015, "bijelo", 35), novo Računalo (2009, "crno", 65)); inventory.forEach (ComputerUtils :: repair); 

4.2. Instancijska metoda postojećeg objekta

Dalje, pogledajmo zanimljiv scenarij - referenciranje metode postojeće instance objekta.

Koristit ćemo varijablu Sustav.van - objekt tipa PrintStream koji podržava ispis metoda:

Računalo c1 = novo Računalo (2015, "bijelo"); Računalo c2 = novo Računalo (2009, "crno"); Računalo c3 = novo Računalo (2014, "crno"); Arrays.asList (c1, c2, c3) .forEach (System.out :: print); 

4.3. Instancijska metoda proizvoljnog predmeta određenog tipa

Računalo c1 = novo Računalo (2015, "bijelo", 100); Računalo c2 = novi MacbookPro (2009, "crni", 100); Popis inventara = Arrays.asList (c1, c2); inventory.forEach (Computer :: turnOnPc); 

Kao što vidite, referenciramo se na turnOnPc metoda ne na određenoj instanci, već na samoj vrsti.

U retku 4 metoda instance turnOnPc bit će pozvan za svaki objekt inventar.

A to prirodno znači da - za c1 metoda turnOnPc bit će pozvan na Računalo instance i za c2 na MacbookPro primjer.

4.4. Super metoda određenog objekta

Pretpostavimo da imate sljedeću metodu u Računalo superrazred:

javna Double DoubleValue (Double InitialValue) {return InitialValue / 1,50; } 

a ovaj u MacbookPro podrazred:

@Override public Double DoubleValue (Double InitialValue) {Funkcija funkcija = super :: CalcuValue; Dvostruko pcValue = function.apply (InitialValue); vrati pcValue + (početna vrijednost / 10); } 

Poziv na izračunatiVrijednost metoda na a MacbookPro primjer:

macbookPro.calculateValue (999,99); 

također će proizvesti i poziv na izračunatiVrijednost na Računalo superrazred.

5. Reference konstruktora

5.1. Stvorite novu instancu

Navođenje konstruktora radi instanciranja objekta može biti vrlo jednostavno:

@FunctionalInterface javno sučelje InterfaceComputer {Computer create (); } InterfaceComputer c = Računalo :: novo; Računalo računala = c.create (); 

Što ako u konstruktoru imate dva parametra?

BiFunction c4Function = Računalo :: novo; Računalo c4 = c4Function.apply (2013, "bijelo"); 

Ako su parametri tri ili više, morate definirati novo funkcionalno sučelje:

@FunctionalInterface sučelje TriFunction {R primijeniti (A a, B b, C c); zadani TriFunction andThen (Funkcija nakon) {Objects.requireNonNull (nakon); return (A a, B b, C c) -> after.apply (primijeniti (a, b, c)); }} 

Zatim inicijalizirajte svoj objekt:

TriFunction c6Function = Računalo :: novo; Računalo c3 = c6Function.apply (2008, "crno", 90); 

5.2. Stvorite niz

Napokon, pogledajmo kako stvoriti niz Računalo objekti s pet elemenata:

Funkcija computerCreator = Računalo [] :: novo; Računalo [] computerArray = computerCreator.apply (5); 

6. Zaključak

Kao što počinjemo vidjeti, operator dvostruke dvotačke - uveden u Javi 8 - bit će vrlo koristan u nekim scenarijima, posebno u vezi sa Streamsom.

Također je vrlo važno pogledati funkcionalna sučelja za bolje razumijevanje onoga što se događa iza kulisa.

Kompletna izvorni kod primjer je dostupan u ovom GitHub projektu - ovo je Maven i Eclipse projekt kako bi se mogao uvesti i koristiti takav kakav jest.