Java Null-Safe adatfolyamok a gyűjteményekből

1. Áttekintés

Ebben az oktatóanyagban megtudhatjuk, hogyan lehet null-biztonságos adatfolyamokat létrehozni a Java-gyűjteményekből.

Első lépésként a Java 8 Method References, Lambda Expressions, Választható és a Stream API-ra van szükség az anyag teljes megértéséhez.

Ha nem ismeri ezeket a témákat, kérjük, először nézze meg korábbi cikkeinket: Új szolgáltatások a Java 8-ban, Útmutató a Java 8 opcionálishoz és Bevezetés a Java 8-adatfolyamokba.

2. Maven-függőség

Mielőtt elkezdenénk, van egy Maven-függőség, amelyre bizonyos esetekben szükségünk lesz:

 org.apache.commons commons-gyűjtemények4 4.2 

A commons-gyűjtemények4 könyvtár letölthető a Maven Central oldalról.

3. Patakok létrehozása gyűjteményekből

Az alapvető megközelítés a Folyam bármilyen típusú Gyűjtemény hívni a folyam() vagy parallelStream () módszerek a gyűjteményen, a szükséges adatfolyam típusától függően:

Gyűjteménygyűjtemény = Arrays.asList ("a", "b", "c"); Stream streamOfCollection = collection.stream (); 

Gyűjteményünknek valószínűleg valamikor lesz külső forrása, valószínűleg az alábbihoz hasonló módszerrel fogunk végezni, amikor streameket hozunk létre gyűjteményekből:

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

Ez problémákat okozhat. Amikor a megadott gyűjtés a nulla hivatkozás, a kód dob a NullPointerException futás közben.

A következő szakasz arról szól, hogyan védekezhetünk ez ellen.

4. A létrehozott gyűjtemény-adatfolyamok semmissé tétele

4.1. Ellenőrzések hozzáadása a megelőzéshez Nulla Dereferenciák

A nem szándékos megelőzés érdekében nulla mutató kivételek, választhatunk az ellenőrzések hozzáadásával a megelőzés érdekében nulla hivatkozások adatfolyamok létrehozásakor gyűjteményekből:

AsStream (gyűjtemény gyűjtemény) {return collection == null? Stream.empty (): gyűjtemény.stream (); } 

Ennek a módszernek azonban van pár kérdése.

Először is a nulla a csekk akadályozza az üzleti logikát, ami csökkenti a program általános olvashatóságát.

Másodszor, a használata nulla az érték hiányának ábrázolása a Java SE 8 utáni téves megközelítésnek számít: Van egy jobb módszer az érték hiányának és jelenlétének modellezésére.

Fontos szem előtt tartani, hogy egy üres Gyűjtemény nem ugyanaz, mint a nullaGyűjtemény. Míg az első azt jelzi, hogy a lekérdezésünknek nincsenek megjelenítendő eredményei vagy elemei, a második arra utal, hogy egyfajta hiba történt éppen a folyamat során.

4.2. Használat emptyIfNull Módszer a CollectionUtils Könyvtár

Választhatjuk az Apache Commons használatát CollectionUtils könyvtár, hogy megbizonyosodjon arról, hogy a mi adatfolyam nulla biztonságos. Ez a könyvtár egy emptyIfNull módszer, amely egy megváltoztathatatlan üres gyűjteményt ad vissza, adott a nulla a gyűjtemény mint érv, vagy maga a gyűjtemény egyébként:

public Stream collectionAsStream (Collection collection) {return emptyIfNull (gyűjtemény) .stream (); } 

Ez egy nagyon egyszerű stratégia, amelyet elfogadni kell. Ez azonban egy külső könyvtár függvénye. Ha egy szoftverfejlesztési házirend korlátozza az ilyen könyvtár használatát, akkor ez a megoldás megjelenik nulla és semmis.

4.3. Használja a Java 8-kat Választható

Java SE 8-k Választható egyértékű tároló, amely vagy tartalmaz értéket, vagy nem. Ahol hiányzik egy érték, az Választható a tartály állítólag üres.

Használata Választható vitathatatlanul a legjobb átfogó stratégiának tekinthető a semmiből biztonságos gyűjtemény létrehozására egy adatfolyamból.

Lássuk, hogyan tudjuk használni, majd az alábbiakban egy gyors beszélgetést folytatunk:

public Stream collectionToStream (Collection collection) {return Optional.ofNullable (collection) .map (Collection :: stream) .orElseGet (Stream :: empty); } 
  • Opcionális.ofNullable (gyűjtemény) létrehoz egy Választható tárgy az átengedett gyűjteményből. Egy üres Választható objektum jön létre, ha a gyűjtemény nulla.
  • térkép (Gyűjtemény :: patak) kivonja a Választható objektum mint argumentum a térkép módszer (Collection.stream ())
  • orElseGet (Stream :: üres) visszatérési értéket ad vissza abban az esetben, ha a Választható az objektum üres, vagyis az átadott gyűjtemény az nulla.

Ennek eredményeként proaktív módon védjük a kódunkat a nem szándékoltaktól nulla mutató kivételek.

4.4. Használja a Java 9-eket FolyamOfNullable

A 4.1. Szakasz korábbi, háromszögű példáját vizsgálva. és néhány elem lehetőségének mérlegelése lehet nulla a helyett Gyűjtemény, rendelkezésünkre áll a ofNullable módszer a Folyam osztály.

Átalakíthatjuk a fenti mintát:

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

5. Következtetés

Ebben a cikkben röviden áttekintettük, hogyan hozhatunk létre adatfolyamot egy adott gyűjteményből. Ezután felfedeztük a három kulcsfontosságú stratégiát annak biztosítására, hogy a létrehozott folyam semmilyen biztonságban legyen, ha gyűjteményből készült.

Végül rámutattunk az egyes stratégiák adott esetben történő alkalmazásának gyengeségére.

Szokás szerint a cikket kísérő teljes forráskód elérhető a GitHubon.