Double Colon Operator i Java 8

1. Oversigt

I denne hurtige artikel vil vi diskutere dobbelt kolonoperatør ( :: ) i Java 8 og gå over de scenarier, hvor operatøren kan bruges.

2. Fra Lambdas til Double Colon Operator

Med Lambdas-udtryk har vi set, at koden kan blive meget kortfattet.

For eksempel til oprette en komparator, er følgende syntaks nok:

Komparator c = (Computer c1, Computer c2) -> c1.getAge (). SammenlignTo (c2.getAge ()); 

Derefter med typeafledning:

Komparator c = (c1, c2) -> c1.getAge (). SammenlignTo (c2.getAge ());

Men kan vi gøre koden ovenfor endnu mere udtryksfuld og læsbar? Lad os kigge på det:

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

Vi har brugt :: operatør som stenografi for lambdas, der kalder en bestemt metode - ved navn. Og slutningen, resultatet er selvfølgelig endnu mere læsbar syntaks.

3. Hvordan fungerer det?

Meget enkelt sagt, når vi bruger en metodehenvisning - målreferencen placeres foran afgrænseren :: og navnet på metoden er angivet efter den.

For eksempel:

Computer :: getAge;

Vi ser på en metodehenvisning til metoden getAge defineret i Computer klasse.

Vi kan derefter operere med den funktion:

Funktion getAge = Computer :: getAge; Heltal computerAge = getAge.apply (c1); 

Bemærk, at vi henviser til funktionen - og derefter anvender den til den rigtige slags argument.

4. Metodehenvisninger

Vi kan gøre god brug af denne operatør i ganske mange scenarier.

4.1. En statisk metode

Først skal vi bruge en statisk hjælpemetode:

Listeoversigt = Arrays.asList (ny computer (2015, "hvid", 35), ny computer (2009, "sort", 65)); inventar.forEach (ComputerUtils :: reparation); 

4.2. En instansmetode for et eksisterende objekt

Lad os derefter se på et interessant scenarie - der henviser til en metode til en eksisterende objektforekomst.

Vi skal bruge variablen System.ud - et objekt af typen PrintStream som understøtter Print metode:

Computer c1 = ny computer (2015, "hvid"); Computer c2 = ny computer (2009, "sort"); Computer c3 = ny computer (2014, "sort"); Arrays.asList (c1, c2, c3) .forEach (System.out :: print); 

4.3. En instansmetode til et vilkårligt objekt af en bestemt type

Computer c1 = ny computer (2015, "hvid", 100); Computer c2 = ny MacbookPro (2009, "sort", 100); Listeopgørelse = Arrays.asList (c1, c2); inventar.forEach (Computer :: turnOnPc); 

Som du kan se, henviser vi til turnOnPc metode ikke på en bestemt forekomst, men på selve typen.

På linje 4 forekommer metoden turnOnPc vil blive kaldt til hvert objekt af beholdning.

Og det betyder naturligvis, at - for c1 metoden turnOnPc vil blive kaldt på Computer eksempel og for c2MacbookPro eksempel.

4.4. En super metode til et bestemt objekt

Antag at du har følgende metode i Computer superklasse:

offentlig Dobbelt beregningsværdi (Double initialValue) {return initialValue / 1.50; } 

og denne i MacbookPro underklasse:

@ Override public Dobbelt beregningsværdi (dobbelt initialværdi) {Funktionsfunktion = super :: beregner værdi; Dobbelt pcValue = function.apply (initialValue); returner pcValue + (initialValue / 10); } 

Et opkald til beregne værdi metode på en MacbookPro eksempel:

macbookPro.calculateValue (999.99); 

vil også producere et opkald til beregne værdi på den Computer superklasse.

5. Konstruktionsreferencer

5.1. Opret en ny instans

Det kan være ret simpelt at henvise til en konstruktør til at instantiere et objekt:

@FunctionalInterface offentlig grænseflade InterfaceComputer {Computer create (); } InterfaceComputer c = Computer :: ny; Computer computer = c.create (); 

Hvad hvis du har to parametre i en konstruktør?

BiFunction c4Function = Computer :: ny; Computer c4 = c4Function.apply (2013, "hvid"); 

Hvis parametrene er tre eller flere, skal du definere en ny funktionel grænseflade:

@FunctionalInterface interface TriFunction {R gælder (Aa, Bb, Cc); standard TriFunction og derefter (funktion efter) {Objects.requireNonNull (efter); returnere (A a, B b, C c) -> efter. ansøg (anvend (a, b, c)); }} 

Initialiser derefter dit objekt:

TriFunction c6Function = Computer :: ny; Computer c3 = c6Function.apply (2008, "sort", 90); 

5.2. Opret en matrix

Lad os endelig se, hvordan man opretter en række Computer objekter med fem elementer:

Funktion computerCreator = Computer [] :: ny; Computer [] computerArray = computerCreator.apply (5); 

6. Konklusion

Som vi begynder at se, vil dobbeltkolonoperatøren - introduceret i Java 8 - være meget nyttig i nogle scenarier og især i forbindelse med Streams.

Det er også ret vigtigt at se på funktionelle grænseflader for at få en bedre forståelse af, hvad der sker bag kulisserne.

Det komplette kildekode for eksemplet er tilgængeligt i dette GitHub-projekt - dette er et Maven- og Eclipse-projekt, så det kan importeres og bruges som det er.