Null-Safe Streamovi iz kolekcija

1. Pregled

U ovom uputstvu vidjet ćemo kako stvoriti null-safe streamove iz Java kolekcija.

Za početak, malo upoznavanja s referencama metoda Java 8, Lambda izrazima, Neobvezno i Stream API potreban je za potpuno razumijevanje ovog materijala.

Ako vam nije poznata nijedna od ovih tema, prvo najprije pogledajte naše prethodne članke: Nove značajke u Javi 8, Vodič za Javu 8 po izboru i Uvod u Java 8 Streamove.

2. Ovisnost Mavena

Prije nego što započnemo, postoji jedna ovisnost o Mavenu koja će nam trebati za određene scenarije:

 org.apache.commons commons-collection4 4.2 

The zajedničke zbirke4 knjižnicu možete preuzeti s Maven Central.

3. Stvaranje streamova iz kolekcija

Osnovni pristup stvaranju a Stream iz bilo koje vrste Kolekcija je nazvati stream () ili paralelni tok () metode na kolekciji, ovisno o vrsti streama koja je potrebna:

Zbirka zbirke = Arrays.asList ("a", "b", "c"); Stream streamOfCollection = collection.stream (); 

Naša će zbirka u jednom trenutku najvjerojatnije imati vanjski izvor, vjerojatno ćemo pri stvaranju streamova iz zbirki dobiti metodu sličnu onoj u nastavku:

public Stream collectionAsStream (Collection collection) {return collection.stream (); } 

To može uzrokovati neke probleme. Kada predviđena zbirka ukazuje na a null referenca, kod će baciti a NullPointerException za vrijeme izvođenja.

Sljedeći odjeljak govori o tome kako se možemo zaštititi od toga.

4. Izrada stvorenih kolekcijskih streamova ništavnim

4.1. Dodajte oznake za sprječavanje Nula Dereferences

Kako bi se spriječilo nenamjerno null izuzeci pokazivača, možemo se odlučiti za dodavanje provjera kako bismo spriječili null reference prilikom stvaranja streamova iz kolekcija:

Stream collectionAsStream (Collection collection) {return collection == null? Stream.empty (): collection.stream (); } 

Ova metoda, međutim, ima nekoliko problema.

Prvo, null check sprečava poslovnu logiku smanjujući ukupnu čitljivost programa.

Drugo, upotreba null predstavljati odsutnost vrijednosti smatra se pogrešnim pristupom nakon Jave SE 8: Postoji bolji način za modeliranje odsutnosti i prisutnosti vrijednosti.

Važno je imati na umu da prazan Kolekcija nije isto što i nullKolekcija. Iako prvi ukazuje da naš upit nema rezultate ili elemente za prikaz, drugi sugerira da se vrsta pogreške upravo dogodila tijekom postupka.

4.2. Koristiti emptyIfNull Metoda iz CollectionUtils Knjižnica

Možemo se odlučiti za korištenje Apache Commons ' CollectionUtils knjižnica kako bismo bili sigurni da je naš stream null sef. Ova knjižnica nudi emptyIfNull metoda koja vraća nepromjenjivu praznu zbirku danu null zbirka kao argument ili sama zbirka u suprotnom:

public Stream collectionAsStream (Collection collection) {return emptyIfNull (collection) .stream (); } 

Ovo je vrlo jednostavna strategija za usvajanje. Međutim, to ovisi o vanjskoj knjižnici. Ako politika razvoja softvera ograničava upotrebu takve knjižnice, tada se pruža rješenje null i ništavnim.

4.3. Koristite Javu 8 Neobvezno

Java SE 8 Neobvezno je spremnik s jednom vrijednošću koji sadrži vrijednost ili je ne sadrži. Tamo gdje vrijednost nedostaje, Neobvezno za kontejner se kaže da je prazan.

Koristeći Neobvezno može se smatrati najboljom sveukupnom strategijom za stvaranje nulto sigurne kolekcije iz streama.

Pogledajmo kako to možemo koristiti, nakon čega slijedi kratka rasprava u nastavku:

public Stream collectionToStream (Collection collection) {return Optional.ofNullable (collection) .map (Collection :: stream) .orElseGet (Stream :: empty); } 
  • Po izboru.ofNullable (zbirka) stvara Neobvezno objekt iz predane zbirke. Prazan Neobvezno objekt se stvara ako je zbirka null.
  • karta (Zbirka :: stream) izdvaja vrijednost sadržanu u Neobvezno objekt kao argument za karta metoda (Collection.stream ())
  • orElseGet (Stream :: empty) vraća rezervnu vrijednost u slučaju da Neobvezno objekt je prazan, tj. predana zbirka je null.

Kao rezultat toga, proaktivno štitimo naš kôd od nenamjernih null pokazivačke iznimke.

4.4. Koristite Javu 9 StreamOdNullable

Ispitujući naš prethodni trokraki primjer u odjeljku 4.1. a s obzirom na mogućnost nekih elemenata mogao bi biti null umjesto Kolekcija, na raspolaganju imamo odNullable metoda u Stream razred.

Gornji uzorak možemo transformirati u:

Stream collectionAsStream (Collection collection) {return collection.stream (). FlatMap (s -> Stream.ofNullable (s)); }

5. Zaključak

U ovom smo članku ukratko pregledali kako stvoriti stream iz zadane kolekcije. Zatim smo nastavili s istraživanjem tri ključne strategije kako bismo osigurali da je stvoreni tok nula-siguran kada je stvoren iz kolekcije.

Na kraju smo ukazali na slabost korištenja svake strategije tamo gdje je to relevantno.

Kao i obično, puni izvorni kod koji prati članak dostupan je na GitHubu.


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