Как преобразовать дополнительный<t> в поток<t>?

Я хочу добавить поток с необязательным. Поскольку Stream.concat может только объединять потоки, у меня есть этот вопрос:

Как преобразовать необязательный тег & lt; T> в поток & lt; T>?

Пример:

Optional<String> optional = Optional.of("Hello");
// or Optional<String> optional = Optional.empty();
Stream<String> texts = optional.stream(); // not working

Ответы

Ответ 1

В Java-9 добавлен отсутствующий метод stream(), поэтому этот код работает:

Stream<String> texts = optional.stream();

См. JDK-8050820. Загрузите Java-9 здесь.

Ответ 2

В Java 8 вы можете сделать это:

Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty);

Ответ 3

Вы можете сделать:

Stream<String> texts = optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();

Ответ 4

Я могу порекомендовать метод GuavaStreams.stream(optional), если вы не используете Java 9. Простой пример:

Streams.stream(Optional.of("Hello"))

Также возможен статический импорт Streams.stream, поэтому вы можете просто написать

stream(Optional.of("Hello"))

Ответ 5

Если вы используете более старую версию Java (смотрите на вас, Android) и используете aNNiMON Lightweight Stream API, вы можете сделать что-то вроде следующего:

    final List<String> flintstones = new ArrayList<String>(){{
        add("Fred");
        add("Wilma");
        add("Pebbles");
    }};

    final List<String> another = Optional.ofNullable(flintstones)
            .map(Stream::of)
            .orElseGet(Stream::empty)
            .toList();

Этот пример просто создает копию списка.

Ответ 6

Хорошая библиотека от одного из моих бывших коллег - Streamify. Много коллекционеров, создающих потоки из практически всего.

https://github.com/sourcy/streamify

Создание потока формы необязательно в streamify:

Streamify.stream(optional)