Módszer hivatkozások Java-ban

1. Áttekintés

Az egyik legörvendetesebb változás a Java 8-ban a lambda kifejezések bevezetése volt, mivel ezek lehetővé teszik az anonim osztályok elhagyását, jelentősen csökkentve a kazánlap kódját és javítva az olvashatóságot.

A módszerreferenciák a lambda kifejezések speciális típusa. Gyakran használják egyszerű lambda kifejezések létrehozására a meglévő módszerek hivatkozásával.

Négyféle módszer hivatkozás létezik:

  • Statikus módszerek
  • Meghatározott objektumok példamódszerei
  • Egy adott típusú tetszőleges objektum példánymódszerei
  • Konstruktőr

Ebben az oktatóanyagban a módszer referenciáit tárjuk fel Java-ban.

2. Hivatkozás statikus módszerre

Kezdjük egy nagyon egyszerű példával, nagybetűvel és kinyomtatva a listát Húrok:

List üzenetek = Arrays.asList ("hello", "baeldung", "olvasók!");

Ezt úgy érhetjük el, hogy egy egyszerű lambda kifejezést használunk, mely a StringUtils.capitalize () módszer közvetlenül:

üzenetek.forEach (szó -> StringUtils.capitalize (szó));

Vagy használhatunk egy metódus-referenciát a nagybetűs statikus módszer:

messages.forEach (StringUtils :: nagybetűs írás);

Vegye figyelembe, hogy a metódus hivatkozások mindig a :: operátor.

3. Hivatkozás egy adott objektum példányos módszerére

Az ilyen típusú referencia bemutatásához vegyünk figyelembe két osztályt:

public class Bicycle {private String márka; privát egész szám frameSize; // szabványos konstruktor, getterek és beállítók} public class BicycleComparator implement Comparator {@Orride public int Compare (Bicycle a, Bicycle b) {return a.getFrameSize (). CompareTo (b.getFrameSize ()); }}

És hozzunk létre egy BicycleComparator objektum a kerékpár vázméretének összehasonlításához:

BicycleComparator bikeFrameSizeComparator = new BicycleComparator ();

Használhatnánk lambda kifejezést a kerékpárok keretméret szerinti rendezéséhez, de az összehasonlításhoz két kerékpárt kell megadnunk:

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

Ehelyett használhatunk egy metódus-referenciát, hogy a fordító kezelje a paramétereket:

createBicyclesList (). stream () .sorted (bikeFrameSizeComparator :: összehasonlítás);

A módszer referencia sokkal tisztább és olvashatóbb, mivel szándékunkat egyértelműen mutatja a kód.

4. Hivatkozás egy adott típusú önkényes objektum példányos módszerére

Ez a fajta metódus-hivatkozás hasonló az előző példához, de anélkül, hogy egyedi összehasonlító objektumot kellene létrehozni.

Hozzunk létre egy Egész szám rendezni kívánt lista:

Lista számok = tömbök. AsList (5, 3, 50, 24, 40, 2, 9, 18);

Ha klasszikus lambda kifejezést használunk, mindkét paramétert kifejezetten át kell adni, míg a módszerre való hivatkozás sokkal egyszerűbb:

számok.folyam () .rendezve ((a, b) -> a.összehasonlításTo (b)); számok.folyam () .sorted (Egész szám: összehasonlítTo);

Annak ellenére, hogy még mindig egyvonalas, a módszer referenciája sokkal könnyebben olvasható és érthető.

5. Hivatkozás egy kivitelezőre

A konstruktorra ugyanúgy hivatkozhatunk, mint az első példánkban egy statikus módszerre. Az egyetlen különbség az, hogy használni fogjuk a új kulcsszó.

Hozzunk létre egy Kerékpár tömb ki a Húr listája különböző márkákkal:

List bikeBrands = Arrays.asList ("Óriás", "Scott", "Trek", "GT");

Először hozzáadunk egy új konstruktort a sajátunkhoz Kerékpár osztály:

public Bicycle (String márka) {this.brand = brand; this.frameSize = 0; } 

Ezután felhasználjuk az új konstruktort egy metódus referenciából, és elkészítjük a Kerékpár tömb az eredetitől Húr lista:

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

Figyeljük meg, hogyan hívtuk mindkettőt Kerékpár és Sor konstruktorok, amelyek metódus-referenciát használnak, sokkal tömörebb és egyértelműbb megjelenést kölcsönözve kódunknak.

6. További példák és korlátozások

Amint eddig láthattuk, a módszerreferenciák nagyszerű módja annak, hogy kódunkat és szándékainkat nagyon egyértelművé és olvashatóvá tegyük. Azonban nem használhatjuk őket mindenféle lambda kifejezés helyettesítésére, mivel vannak bizonyos korlátozásaik.

Fő korlátjuk annak a legnagyobb erősségnek az eredménye: az előző kifejezés kimenetének meg kell egyeznie a hivatkozott metódus aláírás bemeneti paramétereivel.

Lássunk egy példát erre a korlátozásra:

createBicyclesList (). forEach (b -> System.out.printf ("A kerékpár márka '% s' és a keretméret '% d'% n", b.getBrand (), b.getFrameSize ()));

Ezt az egyszerű esetet nem lehet metódus-referenciával kifejezni, mert a printf A módszer a mi esetünkben 3 paramétert igényel, és a createBicyclesList (). forEach () csak egy paraméter (a Kerékpár tárgy).

Végül vizsgáljuk meg, hogyan hozhatunk létre egy működés nélküli funkciót, amelyre lambda kifejezés alapján hivatkozhatunk.

Ebben az esetben egy lambda kifejezést akarunk használni a paramétereinek használata nélkül.

Először hozzuk létre a doNothingAtAll módszer:

privát statikus void doNothingAtAll (Objektum ... o) {}

Mivel ez egy varargs módszer, bármilyen lambda kifejezésben működik, függetlenül a hivatkozott objektumtól vagy a következtetett paraméterek számától.

Most lássuk működés közben:

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

7. Következtetés

Ebben a gyors bemutatóban megtudtuk, hogy milyen módszeres hivatkozások vannak a Java-ban, és hogyan lehet őket használni a lambda kifejezések helyettesítésére, ezáltal javítva az olvashatóságot és tisztázva a programozó szándékát.

A cikkben bemutatott összes kód elérhető a GitHubon.