Double Colon Operator i Java 8
1. Oversikt
I denne raske artikkelen vil vi diskutere dobbelt kolonoperatør ( :: ) i Java 8 og gå gjennom scenariene der operatøren kan brukes.
2. Fra Lambdas til Double Colon Operator
Med Lambdas-uttrykk har vi sett at koden kan bli veldig kortfattet.
For eksempel til lage en komparator, er følgende syntaks nok:
Comparator c = (Computer c1, Computer c2) -> c1.getAge (). CompareTo (c2.getAge ());
Deretter, med typeslutning:
Komparator c = (c1, c2) -> c1.getAge (). SammenligneTo (c2.getAge ());
Men kan vi gjøre koden ovenfor enda mer uttrykksfull og lesbar? La oss se:
Comparator c = Comparator.comparing (Computer :: getAge);
Vi har brukt :: operatør som stenografi for lambdas som kaller en bestemt metode - etter navn. Og slutten, resultatet er selvfølgelig enda mer lesbar syntaks.
3. Hvordan fungerer det?
Svært enkelt, når vi bruker en metodereferanse - blir målreferansen plassert foran skillet :: og navnet på metoden er gitt etter den.
For eksempel:
Datamaskin :: getAge;
Vi ser på en metodehenvisning til metoden getAge definert i Datamaskin klasse.
Vi kan da operere med den funksjonen:
Funksjon getAge = datamaskin :: getAge; Heltall computerAge = getAge.apply (c1);
Legg merke til at vi refererer til funksjonen - og deretter bruker den til riktig type argument.
4. Metode Referanser
Vi kan bruke denne operatøren godt i ganske mange scenarier.
4.1. En statisk metode
Først skal vi bruke en statisk verktøymetode:
Liste inventar = Arrays.asList (ny datamaskin (2015, "hvit", 35), ny datamaskin (2009, "svart", 65)); inventar.forEach (ComputerUtils :: reparasjon);
4.2. En instansmetode for et eksisterende objekt
La oss ta en titt på et interessant scenario - refererer til en metode for en eksisterende objektforekomst.
Vi skal bruke variabelen System.ute - et objekt av typen PrintStream som støtter skrive ut metode:
Datamaskin c1 = ny datamaskin (2015, "hvit"); Datamaskin c2 = ny datamaskin (2009, "svart"); Datamaskin c3 = ny datamaskin (2014, "svart"); Arrays.asList (c1, c2, c3) .forEach (System.out :: print);
4.3. En instansmetode for et vilkårlig objekt av en bestemt type
Datamaskin c1 = ny datamaskin (2015, "hvit", 100); Datamaskin c2 = ny MacbookPro (2009, "svart", 100); Liste inventar = Arrays.asList (c1, c2); inventar.forEach (datamaskin :: turnOnPc);
Som du ser, refererer vi til turnOnPc metode ikke på en bestemt forekomst, men på selve typen.
På linje 4 forekomstmetoden turnOnPc vil bli kalt for hvert objekt av inventar.
Og dette betyr naturlig nok det - for c1 metoden turnOnPc vil bli kalt på Datamaskin instans og for c2 på Macbook Pro forekomst.
4.4. En super metode for et spesielt objekt
Anta at du har følgende metode i Datamaskin superklasse:
offentlig Dobbelt beregningsverdi (Double initialValue) {return initialValue / 1.50; }
og denne i Macbook Pro underklasse:
@ Override public Dobbelt beregningsverdi (Dobbel initialverdi) {Funksjonsfunksjon = super :: beregner Verdi; Dobbel pcValue = function.apply (initialValue); return pcValue + (initialValue / 10); }
En samtale til calculeValue metode på en Macbook Pro forekomst:
macbookPro.calculateValue (999.99);
vil også produsere en samtale til calculeValue på Datamaskin superklasse.
5. Constructor References
5.1. Opprett en ny forekomst
Det kan være ganske enkelt å henvise til en konstruktør for å sette i gang et objekt:
@FunctionalInterface offentlig grensesnitt InterfaceComputer {Computer create (); } InterfaceComputer c = datamaskin :: ny; Datamaskin = c.create ();
Hva om du har to parametere i en konstruktør?
BiFunction c4Function = Datamaskin :: ny; Datamaskin c4 = c4Function.apply (2013, "hvit");
Hvis parametrene er tre eller flere, må du definere et nytt funksjonelt grensesnitt:
@FunctionalInterface interface TriFunction {R gjelder (A a, B b, C c); standard TriFunction andThen (Function after) {Objects.requireNonNull (after); returner (A a, B b, C c) -> etter. søk (gjelder (a, b, c)); }}
Initialiser deretter objektet:
TriFunction c6Function = Datamaskin :: ny; Datamaskin c3 = c6Function.apply (2008, "svart", 90);
5.2. Lag en matrise
Til slutt, la oss se hvordan du lager en rekke Datamaskin objekter med fem elementer:
Funksjon computerCreator = Datamaskin [] :: ny; Computer [] computerArray = computerCreator.apply (5);
6. Konklusjon
Som vi begynner å se, vil dobbelt kolonoperatøren - introdusert i Java 8 - være veldig nyttig i noen scenarier, og spesielt i forbindelse med Streams.
Det er også ganske viktig å se på funksjonelle grensesnitt for å få en bedre forståelse av hva som skjer bak kulissene.
Det komplette kildekode for eksemplet er tilgjengelig i dette GitHub-prosjektet - dette er et Maven og Eclipse-prosjekt slik at det kan importeres og brukes som det er.