Я хочу собрать Optional
в List
, чтобы в итоге я получил список с одним элементом, если присутствует необязательный элемент, или пустой список, если нет.
Единственный способ, который я придумал (в Java 11), - это поток:
var maybe = Optional.of("Maybe");
var list = maybe.stream().collect(Collectors.toList());
Я знаю, что в любом случае это должно быть довольно эффективно, но мне было интересно, есть ли более простой способ преобразовать необязательный элемент в список без использования промежуточного потока?
Да. List.of(maybe.get())
. Конечно, это предполагает, что на самом деле внутри необязательного присутствует значение. В противном случае: var list = maybe.isPresent() ? List.of(maybe.get()) : List.of()
. Полегче? Возможно нет. Без промежуточного потока? Да.
List<String> strings = Optional.ofNullable("Maybe").<List<String>>map(ImmutableList::of).orElseGet(Collections::emptyList);
будет достаточно?
Я бы предложил List<String> maybeList = maybe.map(Collections::singletonList).orElse(Collections.emptyList());
как самый идиоматический способ...
Я согласен с решением @MCEmperor, это лучше, чем использование потока!
Решение @MCEmperor пока единственное, в котором не используются дополнительные экземпляры. В других решениях .map()
, .stream()
, ImmutableList::of
и т. д. все они создают под капотом несколько ненужных экземпляров.
Хорошо, я просто опубликую это как ответ.
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);
Нет, проще некуда.