Metoda Map.computeIfAbsent ()

1. Pregled

U ovom ćemo uputstvu ukratko pogledati novu zadanu metodu computeIfAbsent od Karta sučelje predstavljeno u Javi 8.

Konkretno, pogledat ćemo njegov potpis, upotrebu i način na koji rješava različite slučajeve.

2. Map.computeIfAbsent Metoda

Počnimo s gledanjem potpisa computeIfAbsent:

zadani V computeIfAbsent (tipka K, preslikavanje funkcije Funkcija)

The computeIfAbsent metoda uzima dva parametra. Prvi parametar je ključ a drugi parametar je mappingFunction. Važno je znati da se funkcija mapiranja poziva samo ako mapiranje nije prisutno.

2.1. Ključ povezan s ne-null vrijednošću

Prvo, provjerava je li ključ je prisutan na karti. Ako je ključ je prisutan i ne-null vrijednost je povezana s ključem, a zatim vraća tu vrijednost:

Mapa stringLength = novi HashMap (); stringLength.put ("Ivan", 5); assertEquals ((long) stringLength.computeIfAbsent ("John", s -> s.length ()), 5);

Kao što vidimo, ključ "Ivan" ima ne null preslikavanje, vraća vrijednost 5. Da se koristi naša funkcija mapiranja, očekivali bismo da funkcija vraća dužinu 4.

2.2. Korištenje funkcije mapiranja za izračunavanje vrijednosti

Nadalje, ako je ključ nije prisutan na karti ili je null vrijednost povezana s ključ, zatim pokušava izračunati vrijednost pomoću danog mappingFunction. Također, unosi izračunatu vrijednost na kartu, osim ako izračunata vrijednost nije nula.

Pogledajmo upotrebu mappingFunction u computeIfAbsent metoda:

Mapa stringLength = novi HashMap (); assertEquals ((long) stringLength.computeIfAbsent ("John", s -> s.length ()), 4); assertEquals ((long) stringLength.get ("John"), 4);

Budući da je ključ "Ivan" nije prisutan, izračunava vrijednost prosljeđivanjem ključ kao parametar za mappingFunction.

2.3. Vraćanje funkcije mapiranja null

Također, ako mappingFunction vraća se null, karta ne bilježi mapiranje:

Mapa stringLength = novi HashMap (); assertEquals (stringLength.computeIfAbsent ("John", s -> null), null); assertNull (stringLength.get ("Ivan"));

2.4. Mapiranje funkcija baca iznimku

Napokon, ako mappingFunction baca neprovjerenu iznimku, zatim se izuzetak ponovno baca, a karta ne bilježi mapiranje:

@Test (očekuje se = RuntimeException.class) javna praznina kada jeMappingFunctionThrowsException_thenExceptionIsRethrown () {Mapa stringLength = nova HashMap (); stringLength.computeIfAbsent ("John", s -> {baciti novi RuntimeException ();}); }

Vidimo da je mappingFunction baca a RuntimeException, koji se širi natrag na computeIfAbsent metoda.

3. Zaključak

U ovom kratkom članku pogledali smo computeIfAbsent metoda, njezin potpis i njegova upotreba. Napokon smo vidjeli kako rješava različite slučajeve.

Kao i uvijek, svi su ovi uzorci koda dostupni na GitHub-u.