Java Null-Safe Streams от колекции

1. Общ преглед

В този урок ще видим как да създадем нулево безопасни потоци от Java колекции.

Като начало е необходимо известно запознаване с препратките към методи на Java 8, Lambda Express, Optional и Stream API, за да се разбере напълно този материал.

Ако не сте запознати с някоя от тези теми, първо разгледайте предишните ни статии: Нови функции в Java 8, Ръководство за Java 8 по избор и Въведение в Java 8 Streams.

2. Зависимост на Maven

Преди да започнем, има една зависимост на Maven, която ще ни е необходима за определени сценарии:

 org.apache.commons commons-collections4 4.2 

В Commons-collections4 библиотеката може да бъде изтеглен от Maven Central.

3. Създаване на потоци от колекции

Основният подход за създаване на поток от всякакъв тип колекция е да се извикат методите stream () или паралелен поток () в колекцията в зависимост от типа на потока, който се изисква:

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

Нашата колекция най-вероятно ще има външен източник в даден момент, вероятно ще получим метод, подобен на този по-долу, когато създаваме потоци от колекции:

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

Това може да причини някои проблеми. Когато предоставената колекция сочи към нулева препратка, кодът ще изхвърли NullPointerException по време на изпълнение.

Следващият раздел разглежда как можем да се предпазим от това.

4. Осъществяване на създадените колекционни потоци за безопасни

4.1. Добави Проверки за предотвратяване на Null Dereferences

За да предотвратим непредвидени изключения от нулев указател, можем да изберем да добавим проверки за предотвратяване на нулеви препратки при създаване на потоци от колекции:

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

Този метод обаче има няколко проблема.

Първо, нулевата проверка пречи на бизнес логиката, намалявайки цялостната четливост на програмата.

Второ, използването на null за представяне на отсъствието на стойност се счита за грешен подход след Java SE 8: Има по-добър начин за моделиране на отсъствието и присъствието на стойност.

Важно е да имате предвид, че празната колекция не е същото като нулева колекция . Докато първият показва, че нашата заявка няма резултати или елементи за показване, вторият предполага, че по време на процеса току-що се е случила грешка.

4.2. Използвайте метода emptyIfNull от библиотеката CollectionUtils

Можем да изберем да използваме библиотеката на Apache Commons ' CollectionUtils, за да сме сигурни, че нашият поток е нулев . Тази библиотека предоставя метод emptyIfNull , който връща неизменяема празна колекция, дадена като нулева колекция като аргумент, или самата колекция по друг начин:

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

Това е много проста стратегия за възприемане. Това обаче зависи от външна библиотека. Ако политиката за разработка на софтуер ограничава използването на такава библиотека, след което това решение е постановено нищожно и недействително.

4.3. Използвайте Java 8 по избор

Java SE 8's Optional е контейнер с една стойност, който съдържа стойност или не. Когато липсва стойност, се казва , че контейнерът по избор е празен.

Използването на Незадължително може да се разглежда като най-добрата цялостна стратегия за създаване на нулево безопасна колекция от поток.

Нека да видим как можем да го използваме, последвано от бърза дискусия по-долу:

public Stream collectionToStream(Collection collection) { return Optional.ofNullable(collection) .map(Collection::stream) .orElseGet(Stream::empty); } 
  • Optional.ofNullable (колекция) създава незадължителен обект от предадената колекция. Създава се празен незадължителен обект, ако колекцията е нула.
  • map (Collection :: stream) извлича стойността, съдържаща се в незадължителния обект като аргумент наметода map ( Collection.stream () )
  • orElseGet (Stream :: empty) връща резервната стойност в случай, че незадължителният обект е празен, т.е. предадената колекция е нула .

В резултат на това ние активно защитаваме нашия код срещу нежелани изключения с нулев указател.

4.4. Използвайте Java 9 Stream OfNullable

Разглеждане на предишния ни тройков пример в раздел 4.1. и като се има предвид възможността някои елементи да са нула вместо Collection , имаме на разположение метода ofNullable в класа Stream .

Можем да трансформираме горната проба в:

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

5. Заключение

В тази статия прегледахме накратко как да създадем поток от дадена колекция. След това продължихме да изследваме трите ключови стратегии, за да се уверим, че създаденият поток е нулев, когато е създаден от колекция.

Накрая посочихме слабостта на използването на всяка стратегия там, където е уместно.

Както обикновено, пълният изходен код, придружаващ статията, е достъпен в GitHub.