Odkazy na metódy v prostredí Java

1. Prehľad

Jednou z najvítanejších zmien v prostredí Java 8 bolo zavedenie výrazov lambda, pretože nám umožňujú vzdať sa anonymných tried, čo výrazne znižuje štandardný kód a zlepšuje čitateľnosť.

Odkazy na metódy sú špeciálnym typom výrazov lambda. Často sa používajú na vytváranie jednoduchých výrazov lambda odkazom na existujúce metódy.

Existujú štyri druhy odkazov na metódy:

  • Statické metódy
  • Inštančné metódy konkrétnych objektov
  • Metódy inštancie ľubovoľného objektu konkrétneho typu
  • Konštruktér

V tomto výučbe preskúmame odkazy na metódy v prostredí Java.

2. Odkaz na statickú metódu

Začneme veľmi jednoduchým príkladom, veľkým písmenom a vytlačením zoznamu Struny:

Zoznam správ = Arrays.asList ("ahoj", "baeldung", "čitatelia!");

Môžeme to dosiahnuť využitím jednoduchého výrazu lambda, ktorý volá StringUtils.capitalize () metóda priamo:

messages.forEach (slovo -> StringUtils.capitalize (slovo));

Alebo môžeme odkaz na metódu jednoducho použiť na odkaz na kapitalizovať statická metóda:

messages.forEach (StringUtils :: capitalize);

Všimnite si, že odkazy na metódy vždy využívajú :: operátor.

3. Odkaz na inštančnú metódu konkrétneho objektu

Na demonštráciu tohto typu odkazu na metódu zvážime dve triedy:

verejná trieda Bicykel {súkromná značka String; private Integer frameSize; // standard constructor, getters and setters} public class BicycleComparator implements Comparator {@Override public int compare (Bicycle a, Bicycle b) {return a.getFrameSize (). compareTo (b.getFrameSize ()); }}

A vytvorme a BicycleComparator objekt na porovnanie veľkostí rámu bicykla:

BicycleComparator bikeFrameSizeComparator = nový BicycleComparator ();

Na triedenie bicyklov podľa veľkosti rámu by sme mohli použiť výraz lambda, ale na porovnanie by sme museli určiť dva bicykle:

createBicyclesList (). stream () .sorted ((a, b) -> bikeFrameSizeComparator.compare (a, b));

Namiesto toho môžeme použiť odkaz na metódu, aby nám prešiel parameter zvládnutia kompilátora:

createBicyclesList (). stream () .sorted (bikeFrameSizeComparator :: compare);

Odkaz na metódu je oveľa čistejší a čitateľnejší, pretože náš zámer jasne ukazuje kód.

4. Odkaz na inštančnú metódu ľubovoľného objektu konkrétneho typu

Tento typ odkazu na metódu je podobný predchádzajúcemu príkladu, ale bez nutnosti vytvárania vlastného objektu na vykonanie porovnania.

Vytvorme Celé číslo zoznam, ktorý chceme zoradiť:

Zoznam čísel = Arrays.asList (5, 3, 50, 24, 40, 2, 9, 18);

Ak použijeme klasický výraz lambda, je potrebné explicitne odovzdať obidva parametre, zatiaľ čo použitie odkazu na metódu je oveľa jasnejšie:

numbers.stream () .sorted ((a, b) -> a.compareTo (b)); numbers.stream () .sorted (Integer :: compareTo);

Aj keď je to stále jednorázová linka, odkaz na metódu je oveľa ľahšie čitateľný a pochopiteľný.

5. Odkaz na konštruktéra

Môžeme odkazovať na konštruktor rovnakým spôsobom, akým sme v prvom príklade odkazovali na statickú metódu. Jediný rozdiel je v tom, že použijeme Nový kľúčové slovo.

Vytvorme a Bicykel pole z a String zoznam rôznych značiek:

Zoznam bikeBrands = Arrays.asList ("Giant", "Scott", "Trek", "GT");

Najskôr do našej pridáme nový konštruktor Bicykel trieda:

verejné bicykel (značka reťazca) {this.brand = značka; this.frameSize = 0; } 

Ďalej použijeme náš nový konštruktor z odkazu na metódu a urobíme a Bicykel pole z originálu String zoznam:

bikeBrands.stream () .map (Bicycle :: new) .toArray (Bicycle [] :: new); 

Všimnite si, ako sme oboch volali Bicykel a Pole konštruktéri používajúci odkaz na metódu, vďaka čomu má náš kód oveľa stručnejší a jasnejší vzhľad.

6. Ďalšie príklady a obmedzenia

Ako sme už videli, odkazy na metódy sú skvelým spôsobom, ako urobiť náš kód a zámery veľmi jasnými a čitateľnými. Nemôžeme ich však použiť na nahradenie všetkých druhov výrazov lambda, pretože majú určité obmedzenia.

Ich hlavné obmedzenie je výsledkom ich najväčšej sily: výstup z predchádzajúceho výrazu musí zodpovedať vstupným parametrom podpisu odkazovanej metódy.

Pozrime sa na príklad tohto obmedzenia:

createBicyclesList (). forEach (b -> System.out.printf ("Značka bicykla je '% s' a veľkosť rámu je '% d'% n", b.getBrand (), b.getFrameSize ()));

Tento jednoduchý prípad nie je možné vyjadriť odkazom na metódu, pretože printf metóda vyžaduje v našom prípade 3 parametre a použitie createBicyclesList (). forEach () by umožnil odkazu na metódu odvodiť iba jeden parameter (parameter Bicykel objekt).

Na záver poďme preskúmať, ako vytvoriť funkciu bez operácie, na ktorú sa dá odkazovať z výrazu lambda.

V takom prípade budeme chcieť použiť výraz lambda bez použitia jeho parametrov.

Najskôr vytvorme doNothingAtAll metóda:

private static void doNothingAtAll (Object ... o) {}

Pretože ide o metódu varargs, bude fungovať v akomkoľvek výraze lambda bez ohľadu na odkazovaný objekt alebo odvodený počet parametrov.

Pozrime sa na to v akcii:

createBicyclesList () .forEach ((o) -> MethodReferenceExamples.doNothingAtAll (o)); 

7. Záver

V tomto rýchlom výučbe sme sa dozvedeli, aké odkazy na metódy sú v Jave a ako ich používať na nahradenie výrazov lambda, čím sa zlepší čitateľnosť a objasní sa zámer programátora.

Celý kód uvedený v tomto článku je k dispozícii na GitHub.


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