Reference o metodama u Javi

1. Pregled

Jedna od najpoželjnijih promjena u Javi 8 bilo je uvođenje lambda izraza, jer nam oni omogućavaju da se odreknemo anonimnih klasa, uvelike smanjujući kod i poboljšavajući čitljivost.

Referencije metoda posebna su vrsta lambda izraza. Često se koriste za stvaranje jednostavnih lambda izraza pozivanjem na postojeće metode.

Postoje četiri vrste referenci o metodama:

  • Statičke metode
  • Instance metode pojedinih objekata
  • Instance metode proizvoljnog objekta određenog tipa
  • Konstruktor

U ovom uputstvu istražit ćemo reference metoda na Javi.

2. Upućivanje na statičku metodu

Počet ćemo s vrlo jednostavnim primjerom, pisanjem velikih slova i ispisom popisa Žice:

Poruke na popisu = Arrays.asList ("zdravo", "baeldung", "čitatelji!");

To možemo postići korištenjem jednostavnog lambda izraza koji poziva StringUtils.capitalize () metoda izravno:

messages.forEach (riječ -> StringUtils.capitalize (riječ));

Ili se možemo poslužiti referencom metode da bismo se jednostavno pozvali na kapitalizirati statička metoda:

messages.forEach (StringUtils :: velika slova);

Primijetite da reference metoda uvijek koriste :: operater.

3. Upućivanje na primjerenu metodu određenog predmeta

Da bismo demonstrirali ovu vrstu reference metode, razmotrimo dvije klase:

javna klasa Bicikl {marka privatnih žica; privatni Integer frameSize; // standardni konstruktor, getteri i postavljači} javna klasa BicycleComparator implementira komparator {@Preuzmi public int compare (Bicycle a, Bicycle b) {return a.getFrameSize (). compareTo (b.getFrameSize ()); }}

I, stvorimo a BicycleComparator objekt za usporedbu veličina okvira bicikla:

BicycleComparator bikeFrameSizeComparator = novi BicycleComparator ();

Za sortiranje bicikala prema veličini okvira mogli bismo koristiti lambda izraz, ali za usporedbu bismo trebali navesti dva bicikla:

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

Umjesto toga, možemo upotrijebiti referencu na metodu da nam parametar obrađivača kompajlera proslijedi:

createBicyclesList (). stream (). sortirano (bikeFrameSizeComparator :: usporedba);

Referenca metode mnogo je čišća i čitljivija, jer kôd jasno pokazuje našu namjeru.

4. Upućivanje na metodu instance proizvoljnog predmeta određenog tipa

Ova vrsta reference metode slična je prethodnom primjeru, ali bez potrebe za izradom prilagođenog objekta za izvođenje usporedbe.

Stvorimo Cijeli broj popis koji želimo sortirati:

Brojevi popisa = Arrays.asList (5, 3, 50, 24, 40, 2, 9, 18);

Ako koristimo klasični lambda izraz, oba parametra treba izričito proslijediti, dok je upotreba reference metode mnogo jednostavnija:

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

Iako je i dalje jednolinijski, referencu o metodi je puno lakše pročitati i razumjeti.

5. Upućivanje na konstruktora

Na konstruktor se možemo pozivati ​​na isti način na koji smo se pozivali na statičku metodu u našem prvom primjeru. Jedina je razlika što ćemo koristiti novi ključna riječ.

Stvorimo a Bicikl niz iz a Niz popis različitih marki:

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

Prvo ćemo dodati novi konstruktor u naš Bicikl razred:

javni bicikl (žica marke) {this.brand = brand; this.frameSize = 0; } 

Dalje ćemo upotrijebiti naš novi konstruktor iz reference metode i napraviti a Bicikl niz od izvornika Niz popis:

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

Primijetite kako smo nazvali oboje Bicikl i Polje konstruktori koji koriste referencu na metodu, dajući našem kodu puno sažetiji i jasniji izgled.

6. Dodatni primjeri i ograničenja

Kao što smo do sada vidjeli, reference metoda odličan su način da naš kôd i namjere postanu vrlo jasni i čitljivi. Međutim, ne možemo ih koristiti za zamjenu svih vrsta lambda izraza jer imaju neka ograničenja.

Njihovo glavno ograničenje rezultat je onoga što je ujedno i njihova najveća snaga: izlaz iz prethodnog izraza mora odgovarati ulaznim parametrima potpisa referencirane metode.

Pogledajmo primjer ovog ograničenja:

createBicyclesList (). forEach (b -> System.out.printf ("Marka bicikla je '% s', a veličina okvira je '% d'% n", b.getBrand (), b.getFrameSize ()));

Ovaj jednostavan slučaj ne može se izraziti referencom metode, jer printf metoda zahtijeva 3 parametra u našem slučaju i korištenje createBicyclesList (). forEach () dopuštao bi upućivanje na metodu samo za zaključivanje jednog parametra ( Bicikl objekt).

Na kraju, istražimo kako stvoriti funkciju bez rada na koju se može referencirati lambda izraz.

U ovom ćemo slučaju htjeti koristiti lambda izraz bez korištenja njegovih parametara.

Prvo, kreirajmo doNothingAtAll metoda:

privatna statička praznina doNothingAtAll (Objekt ... o) {}

Kako se radi o varargs metodi, ona će raditi u bilo kojem lambda izrazu, bez obzira na referencirani objekt ili broj izvedenih parametara.

Pogledajmo sada na djelu:

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

7. Zaključak

U ovom smo brzom vodiču naučili koje su reference metoda u Javi i kako ih koristiti za zamjenu lambda izraza, poboljšavajući tako čitljivost i pojašnjavajući namjeru programera.

Sav kôd predstavljen u ovom članku dostupan je na GitHubu.