Ответ 1
Вы можете использовать функцию org.apache.commons.collections4.CollectionUtils:: emptyIfNull:
org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
Я ищу метод, который может создавать поток коллекции, но является нулевым. Если коллекция null, возвращается пустой поток. Вот так:
Utils.collectionAsStream(collection).filter(...);
Я создал свой собственный метод:
public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
if (collection == null) {
return Stream.empty();
}
return collection.stream();
}
Но мне любопытно, если в стандартном JDK есть что-то подобное?
Вы можете использовать функцию org.apache.commons.collections4.CollectionUtils:: emptyIfNull:
org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
Вы можете использовать Optional
:
Optional.ofNullable(collection).orElse(Collections.emptySet()).stream()...
Я выбрал Collections.emptySet()
произвольно, поскольку значение по умолчанию в случае collection
равно null. Это приведет к вызову метода stream()
, создающему пустой Stream
, если collection
имеет значение null.
Пример:
Collection<Integer> collection = Arrays.asList (1,2,3);
System.out.println (Optional.ofNullable(collection).orElse(Collections.emptySet()).stream().count ());
collection = null;
System.out.println (Optional.ofNullable(collection).orElse(Collections.emptySet()).stream().count ());
Вывод:
3
0
В качестве альтернативы, как предложил marstran, вы можете использовать:
Optional.ofNullable(collection).map(Collection::stream).orElse(Stream.empty ())...
Ваш метод collectionAsStream()
может быть упрощен до версии, даже более простой, чем при использовании Optional
:
public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
return collection == null ? Stream.empty() : collection.stream();
}
Обратите внимание, что в большинстве случаев, вероятно, лучше просто проверить значение nullness перед построением конвейера потока:
if (collection != null) {
collection.stream().filter(...)
} // else do nothing
То, что вы хотите, кажется полезным только тогда, когда вам нужно вернуть поток (в том числе для flatmapping), или, возможно, соединить его с другим.
Вы можете использовать что-то вроде этого:
public static void main(String [] args) {
List<String> someList = new ArrayList<>();
asStream(someList).forEach(System.out::println);
}
public static <T> Stream<T> asStream(final Collection<T> collection) {
return Optional.ofNullable(collection)
.map(Collection::stream)
.orElseGet(Stream.empty());
}
Если загрузка библиотеки org.apache.commons.collections4
не является вариантом, вы можете просто написать свой собственный метод обёртки/удобства.
public static <T> Stream<T> asStream(final Collection<T> collection) {
return collection == null ? ( Stream<T> ) Collections.emptyList().stream()
: collection.stream();
}
Или обертывание коллекции с помощью Optional.ofNullable
public static <T> Stream<T> asStream(final Collection<T> collection) {
return Optional.ofNullable(collection)
.orElse( Collections.emptySet()).stream();
}