Nulovo bezpečné toky Java zo zbierok

1. Prehľad

V tomto tutoriále sa dozvieme, ako vytvoriť streamy bezpečné pre nuly zo zbierok Java.

Na začiatok je potrebné oboznámiť sa s metódami Java 8 Method Reference, Lambda Expressions, Voliteľné a Stream API je potrebný na úplné pochopenie tohto materiálu.

Ak nie ste oboznámení s niektorou z týchto tém, najskôr si prosím prečítajte naše predchádzajúce články: Nové funkcie v prostredí Java 8, Sprievodca doplnkom Java 8 a Úvod do prúdov Java 8.

2. Závislosť od Maven

Než začneme, je tu jedna závislosť Maven, ktorú budeme potrebovať pre určité scenáre:

 org.apache.commons commons-collections4 4.2 

The spoločné zbierky4 knižnicu je možné stiahnuť z Maven Central.

3. Vytváranie streamov zo zbierok

Základný prístup k vytvoreniu a Prúd z akéhokoľvek typu Zbierka je zavolať na Prúd() alebo parallelStream () metódy zhromažďovania v závislosti od požadovaného typu toku:

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

Naša zbierka bude s najväčšou pravdepodobnosťou mať niekedy externý zdroj, pravdepodobne pri vytváraní streamov zo zbierok skončíme s metódou podobnou tej, ktorá je uvedená nižšie:

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

To môže spôsobiť určité problémy. Keď poskytnuté odberné miesta poukazujú na a nulový odkaz, kód vrhá a NullPointerException za behu.

Nasledujúca časť sa venuje tomu, ako sa môžeme proti tomu chrániť.

4. Zabezpečenie bezpečnosti vytvorených streamov kolekcie

4.1. Pridajte Kontroly, aby ste zabránili Nulový Odkazy

Aby sa zabránilo neúmyselnému nulový výnimky ukazovateľa, môžeme sa rozhodnúť pridať kontroly, aby sme tomu zabránili nulový referencie pri vytváraní streamov zo zbierok:

Stream collectionAsStream (zbierka zbierky) {návrat zbierka == null? Stream.empty (): collection.stream (); } 

Táto metóda má však niekoľko problémov.

Po prvé, nulový šek prekáža obchodnej logike znižujúcej celkovú čitateľnosť programu.

Po druhé, použitie nulový predstavovať absenciu hodnoty sa považuje za nesprávny prístup po prostredí Java SE 8: Existuje lepší spôsob, ako modelovať absenciu a prítomnosť hodnoty.

Je dôležité mať na pamäti, že prázdne Zbierka nie je to isté ako a nulovýZbierka. Zatiaľ čo prvý naznačuje, že náš dopyt nemá výsledky alebo prvky na zobrazenie, druhý naznačuje, že sa v priebehu procesu stala akási chyba.

4.2. Použite emptyIfNull Metóda z CollectionUtils Knižnica

Môžeme sa rozhodnúť použiť program Apache Commons CollectionUtils knižnicu, aby sme sa uistili, že náš stream je nulový bezpečné. Táto knižnica poskytuje emptyIfNull metóda, ktorá vráti nemennú prázdnu zbierku danú a nulový zbierka ako argument alebo iná zbierka inak:

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

Prijatie tejto stratégie je veľmi jednoduché. Závisí to však od externej knižnice. Ak politika vývoja softvéru obmedzuje použitie takejto knižnice, toto riešenie sa vykreslí nulový a neplatné.

4.3. Používajte Java 8 Voliteľné

Java SE 8 Voliteľné je kontajner s jednou hodnotou, ktorý buď obsahuje hodnotu, alebo nie. Ak chýba hodnota, Voliteľné kontajner je vraj prázdny.

Použitím Voliteľné možno pravdepodobne považovať za najlepšiu celkovú stratégiu na vytvorenie zbierky bezpečnej pre nulový tok z toku.

Pozrime sa, ako to môžeme využiť, po čom nasleduje rýchla diskusia nižšie:

public Stream collectionToStream (Collection collection) {return Optional.ofNullable (collection) .map (Collection :: stream) .orElseGet (Stream :: empty); } 
  • Optional.ofNullable (kolekcia) vytvára Voliteľné predmet z odovzdanej zbierky. Prázdny Voliteľné objekt je vytvorený, ak je kolekcia nulový.
  • mapa (Zbierka :: stream) extrahuje hodnotu obsiahnutú v Voliteľné namietať ako argument pre mapa metóda (Collection.stream ())
  • orElseGet (stream :: prázdny) vráti záložnú hodnotu v prípade, že Voliteľné objekt je prázdny, to znamená, že odovzdaná kolekcia je nulový.

Vďaka tomu proaktívne chránime náš kód pred neúmyselným použitím nulový výnimky ukazovateľa.

4.4. Používajte Java 9 PrúdOfNullable

Preskúmame náš predchádzajúci ternárny príklad v časti 4.1. a zváženie možnosti niektorých prvkov by mohlo byť nulový namiesto Zbierka, máme k dispozícii ofNullable metóda v Prúd trieda.

Vyššie uvedenú vzorku môžeme transformovať na:

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

5. Záver

V tomto článku sme sa v krátkosti vrátili k tomu, ako vytvoriť stream z danej zbierky. Potom sme pokračovali v preskúmaní troch kľúčových stratégií, ktoré zaisťujú, že vytvorený stream je bezpečný, keď je vytvorený zo zbierky.

Na záver sme poukázali na slabé stránky používania každej stratégie tam, kde je to relevantné.

Celý zdrojový kód, ktorý je priložený k článku, je ako obvykle dostupný na serveri GitHub.


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