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 c2Macbook 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 calculeValueDatamaskin 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.


$config[zx-auto] not found$config[zx-overlay] not found