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.