Ответ 1
В Java-9 добавлен отсутствующий метод stream()
, поэтому этот код работает:
Stream<String> texts = optional.stream();
См. JDK-8050820. Загрузите Java-9 здесь.
Я хочу добавить поток с необязательным. Поскольку 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
В Java-9 добавлен отсутствующий метод stream()
, поэтому этот код работает:
Stream<String> texts = optional.stream();
См. JDK-8050820. Загрузите Java-9 здесь.
В Java 8 вы можете сделать это:
Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty);
Вы можете сделать:
Stream<String> texts = optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
Я могу порекомендовать метод GuavaStreams.stream(optional)
, если вы не используете Java 9. Простой пример:
Streams.stream(Optional.of("Hello"))
Также возможен статический импорт Streams.stream
, поэтому вы можете просто написать
stream(Optional.of("Hello"))
Если вы используете более старую версию 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();
Этот пример просто создает копию списка.
Хорошая библиотека от одного из моих бывших коллег - Streamify. Много коллекционеров, создающих потоки из практически всего.
https://github.com/sourcy/streamify
Создание потока формы необязательно в streamify:
Streamify.stream(optional)