Преобразование необязательного в список

Я хочу собрать Optional в List, чтобы в итоге я получил список с одним элементом, если присутствует необязательный элемент, или пустой список, если нет.

Единственный способ, который я придумал (в Java 11), - это поток:

var maybe = Optional.of("Maybe");
var list = maybe.stream().collect(Collectors.toList());

Я знаю, что в любом случае это должно быть довольно эффективно, но мне было интересно, есть ли более простой способ преобразовать необязательный элемент в список без использования промежуточного потока?

Нет, проще некуда.

rzwitserloot 15.12.2020 14:01

Да. List.of(maybe.get()). Конечно, это предполагает, что на самом деле внутри необязательного присутствует значение. В противном случае: var list = maybe.isPresent() ? List.of(maybe.get()) : List.of(). Полегче? Возможно нет. Без промежуточного потока? Да.

MC Emperor 15.12.2020 14:05

List<String> strings = Optional.ofNullable("Maybe").<List<String>>map(ImmutableList‌​::of).orElseGet(Coll‌​ections::emptyList); будет достаточно?

terrorrussia-keeps-killing 15.12.2020 14:06

Я бы предложил List<String> maybeList = maybe.map(Collections::singletonList).orElse(Collections.emp‌​tyList()); как самый идиоматический способ...

Gyro Gearless 15.12.2020 14:09

Я согласен с решением @MCEmperor, это лучше, чем использование потока!

Youcef LAIDANI 15.12.2020 14:20

Решение @MCEmperor пока единственное, в котором не используются дополнительные экземпляры. В других решениях .map(), .stream(), ImmutableList::of и т. д. все они создают под капотом несколько ненужных экземпляров.

Ralf Kleberhoff 15.12.2020 14:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
2 930
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, я просто опубликую это как ответ.

List.of(maybe.get()). Конечно, это предполагает, что на самом деле внутри необязательного присутствует значение. В противном случае: var list = maybe.isPresent() ? List.of(maybe.get()) : List.of().

Это проще? Возможно нет. Это без промежуточного потока? Да.

Ответ принят как подходящий

Я думаю, что самым идиоматичным способом было бы использовать Optional.map:

var maybe = Optional.of("Maybe");
var list = maybe.map(List::of).orElse(Collections.emptyList());

Или, если вы не хотите создавать пустой список, который может оказаться неиспользованным в конце:

var list = maybe.map(List::of).orElseGet(Collections::emptyList);

Другие вопросы по теме