Java opcionális - orElse () vs orElseGet ()

1. Bemutatkozás

Az API Választható általában kétféle módszer áll rendelkezésre, amelyek zavart okozhatnak: különben() és vagyElseGet ().

Ebben a gyors bemutatóban megvizsgáljuk a kettő közötti különbséget, és feltárjuk, mikor kell használni mindegyiket.

2. Aláírások

Kezdjük először az alapokkal, és nézzük meg az aláírásukat:

public T orElse (T egyéb) public T orElseGet (egyéb szállító)

Tisztán, különben() bármely típusú paramétert felvesz T mivel vagyElseGet () típusú funkcionális interfészt fogad el Támogató amely egy típusú objektumot ad vissza T.

Most, a dzsádóik alapján:

  • különben(): visszaadja az értéket, ha van, különben adja vissza Egyéb
  • vagyElseGet (): visszaadja az értéket, ha van, különben hívja meg Egyéb és adja vissza a hívásának eredményét

3. Különbségek

Könnyű kissé megzavarni ezeket az egyszerűsített definíciókat, ezért ássunk egy kicsit mélyebbre, és nézzünk meg néhány tényleges használati szituációt.

3.1. különben()

Feltéve, hogy a naplózónk megfelelően van konfigurálva, kezdjük egy egyszerű kódrészlet megírásával:

Karakterlánc neve = Opcionális.of ("baeldung") .orElse (getRandomName ());

Figyelje meg getRandomName () olyan módszer, amely véletlenszerű eredményt ad név a-tól Listanak,-nek nevek:

public String getRandomName () {LOG.info ("getRandomName () metódus - indítás"); Véletlenszerű véletlenszerű = új Véletlenszerű (); int index = random.nextInt (5); LOG.info ("getRandomName () metódus - vég"); return names.get (index); }

A kód végrehajtásakor az alábbiakban megtaláljuk a konzolba nyomtatott üzeneteket:

getRandomName () metódus - start getRandomName () metódus - end

A változó név tartani fog „Baeldung” a kód végrehajtásának végén.

Vele könnyen arra következtethetünk, hogy a paramétere különben() akkor is kiértékelődik, ha nem üres Választható.

3.2. vagyElseGet ()

Most próbálkozzunk hasonló kód használatával vagyElseGet ():

Karakterlánc neve = Opcionális.of ("baeldung") .orElseGet (() -> getRandomName ());

A fenti kód nem fog hivatkozni getRandomName () módszer.

Ne feledje (a javadocból), hogy az Sfelsõbb Az argumentumként átadott metódust csak akkor hajtják végre egy Opcionális érték nincs jelen.

Használata vagyElseGet () mert esetünk tehát időt takarít meg nekünk egy véletlenszerű számítással név.

4. A teljesítmény hatásának mérése

Most, hogy megértsük a teljesítménybeli különbségeket, használjuk a JMH-t, és nézzünk meg néhány tényleges számot:

@Benchmark @BenchmarkMode (Mode.AverageTime) public String vagyElseBenchmark () {return Optional.of ("baeldung"). OrElse (getRandomName ()); }

És vagyElseGet ():

@Benchmark @BenchmarkMode (Mode.AverageTime) public String vagyElseGetBenchmark () {return Optional.of ("baeldung"). VagyElseGet (() -> getRandomName ()); }

A benchmark módszerek végrehajtása közben a következőket kapjuk:

Benchmark Mode Cnt Score Hibaegységek vagyElseBenchmark avgt 20 60934.425 ± 15115.599 ns / op vagyElseGetBenchmark avgt 20 3.798 ± 0.030 ns / op

Mint láthatjuk, a teljesítményre gyakorolt ​​hatás még egy ilyen egyszerű használati eset esetén is jelentős lehet.

A fenti számok azonban kissé eltérhetnek, vagyElseGet () egyértelműen felülteljesített különben() konkrét példánkra.

Végül, különben() számításával jár getRandomName () módszer az egyes futtatásokhoz.

5. Mi a fontos?

A teljesítmény szempontjain kívül egyéb megfontolandó tényezők a következők:

  • Mi lenne, ha a módszer valami további logikát hajtana végre? Például. néhány DB-beszúrás vagy frissítés készítése
  • Akkor is, ha objektumot rendelünk hozzá különben() paraméter:
    Karakterlánc neve = Opcionális.of ("baeldung"). VagyElse ("Egyéb")

    még mindig alkotunk "Egyéb" objektum minden ok nélkül

Ezért fontos számunkra, hogy körültekintően döntsünk különben() és vagyElseGet () igényeinktől függően - alapértelmezés szerint ésszerűbb használni vagyElseGet () minden alkalommal, hacsak az alapértelmezett objektum már nem készült és közvetlenül elérhető.

6. Következtetés

Ebben a cikkben megismertük az árnyalatokat Opcionális vagy Else () és OrElseGet () mód. Azt is észrevettük, hogy az ilyen egyszerű fogalmaknak néha mélyebb jelentése lehet.

Mint mindig, a teljes forráskód megtalálható a Github oldalon.


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