Operátor Double Colon v prostredí Java 8

1. Prehľad

V tomto rýchlom článku si rozoberieme operátor dvojitého hrubého čreva ( :: ) v Jave 8 a prejdite si scenáre, v ktorých je možné operátora použiť.

2. Od spoločnosti Lambdas k operátorovi dvojbodiek

S výrazmi Lambdas sme videli, že kód môže byť veľmi stručný.

Napríklad do vytvoriť komparátor, stačí nasledovná syntax:

Komparátor c = (Počítač c1, Počítač c2) -> c1.getAge (). CompareTo (c2.getAge ()); 

Potom s odvodením typu:

Komparátor c = (c1, c2) -> c1.getAge (). CompareTo (c2.getAge ());

Môžeme však urobiť vyššie uvedený kód ešte expresívnejším a čitateľnejším? Pozrime sa na to:

Komparátor c = Comparator.comparing (Computer :: getAge); 

Použili sme :: operátor ako skratka pre lambdy volajúce konkrétnou metódou - podľa názvu. Výsledkom je samozrejme ešte čitateľnejšia syntax.

3. Ako to funguje?

Veľmi zjednodušene povedané, keď používame odkaz na metódu - cieľová referencia je umiestnená pred oddeľovač :: a názov metódy je uvedený za ňou.

Napríklad:

Počítač :: getAge;

Pozeráme sa na odkaz na metódu getAge definované v Počítač trieda.

Potom môžeme pracovať s touto funkciou:

Funkcia getAge = Počítač :: getAge; Celé číslo computerAge = getAge.apply (c1); 

Všimnite si, že odkazujeme na funkciu - a potom ju aplikujeme na správny druh argumentu.

4. Odkazy na metódy

Tento operátor môžeme dobre využiť v niekoľkých scenároch.

4.1. Statická metóda

Najprv použijeme statická úžitková metóda:

Zoznam zásob = Arrays.asList (nový počítač (2015, „biely“, 35), nový počítač (2009, „čierny“, 65)); inventory.forEach (ComputerUtils :: repair); 

4.2. Instančná metóda existujúceho objektu

Ďalej sa pozrime na zaujímavý scenár - odkazovanie na metódu existujúcej inštancie objektu.

Budeme používať premennú Systém.von - objekt typu PrintStream ktorý podporuje tlačiť metóda:

Počítač c1 = nový počítač (2015, „biely“); Počítač c2 = nový počítač (2009, „čierny“); Počítač c3 = nový počítač (2014, „čierny“); Arrays.asList (c1, c2, c3) .forEach (System.out :: print); 

4.3. Instančná metóda ľubovoľného objektu konkrétneho typu

Počítač c1 = nový počítač (2015, „biely“, 100); Počítač c2 = nový MacbookPro (2009, „čierny“, 100); Zoznam inventára = Arrays.asList (c1, c2); inventory.forEach (Computer :: turnOnPc); 

Ako vidíte, odkazujeme na turnOnPc metóda nie na konkrétnej inštancii, ale na samotnom type.

Na riadku 4 inštančná metóda turnOnPc bude volaný pre každý objekt súpis.

A to prirodzene znamená, že - pre c1 metóda turnOnPc bude vyzvaný na Počítač napríklad a pre c2 na MacBook Pro inštancia.

4.4. Super metóda konkrétneho objektu

Predpokladajme, že máte v Počítač nadtrieda:

public Double CalcValue (Double initialValue) {return initialValue / 1,50; } 

a tento v MacBook Pro podtrieda:

@ Verzia verejné Double VypočítaťHodnotu (Double initialValue) {Funkcia funkcia = super :: vypočítaťHodnotu; Dvojitá pcValue = function.apply (initialValue); vrátiť pcValue + (initialValue / 10); } 

Výzva na vypočítaťHodnotu metóda na a MacBook Pro inštancia:

macbookPro.calculateValue (999,99); 

tiež vygeneruje výzvu na číslo vypočítaťHodnotu na Počítač nadtrieda.

5. Referencie konštruktéra

5.1. Vytvorte novú inštanciu

Odkazovanie na konštruktora na vytvorenie inštancie objektu môže byť celkom jednoduché:

@FunkčnéInterface verejné rozhranie InterfaceComputer {Počítač create (); } InterfaceComputer c = Počítač :: nový; Počítač počítač = c.create (); 

Čo ak máte v konštruktore dva parametre?

BiFunction c4Function = Počítač :: nový; Počítač c4 = c4Function.apply (2013, „biely“); 

Ak sú parametre tri alebo viac, musíte definovať nové funkčné rozhranie:

@FunctionalInterface rozhranie TriFunction {R platí (A a, B b, C c); predvolené TriFunction aThen (Funkcia po) {Objects.requireNonNull (po); návrat (A a, B b, C c) -> after.apply (použiť (a, b, c)); }} 

Potom inicializujte svoj objekt:

TriFunction c6Function = Počítač :: nový; Počítač c3 = c6Function.apply (2008, „čierny“, 90); 

5.2. Vytvorte pole

Na záver sa pozrime, ako vytvoriť pole Počítač objekty s piatimi prvkami:

Function computerCreator = Počítač [] :: nový; Computer [] computerArray = computerCreator.apply (5); 

6. Záver

Ako už začíname vidieť, operátor dvojitého dvojbodka - predstavený v Jave 8 - bude v niektorých scenároch veľmi užitočný, najmä v spojení s prúdmi.

Je tiež dosť dôležité pozrieť sa na funkčné rozhrania, aby ste lepšie pochopili, čo sa deje v zákulisí.

Kompletný zdrojový kód príklad je k dispozícii v tomto projekte GitHub - jedná sa o projekt Maven a Eclipse, aby ho bolo možné importovať a použiť tak, ako je.


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