Подтвердить что ты не робот

Null safe Collection как поток в Java 8

Я ищу метод, который может создавать поток коллекции, но является нулевым. Если коллекция null, возвращается пустой поток. Вот так:

Utils.collectionAsStream(collection).filter(...);

Я создал свой собственный метод:

public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
    if (collection == null) {
        return Stream.empty();
    }
    return collection.stream();
}

Но мне любопытно, если в стандартном JDK есть что-то подобное?

4b9b3361

Ответ 1

Вы можете использовать функцию org.apache.commons.collections4.CollectionUtils:: emptyIfNull:

  org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);

Ответ 2

Вы можете использовать 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 ())...

Ответ 3

Ваш метод 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), или, возможно, соединить его с другим.

Ответ 4

Вы можете использовать что-то вроде этого:

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());
}

Ответ 5

Если загрузка библиотеки 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();
}