Ответ 1
Optional<Integer> aOrB = a.isPresent() ? a : b;
Я доволен ответом на любом языке, но в конечном итоге хочу получить ответ на Java. (Java 8+ в порядке. Не ограничивается Java 8. Я пытался исправить теги.)
Если у меня есть два значения Optional<Integer>
, как я могу кратко вычислить эквивалент a || b
, что означает: a
, если он определен; иначе b
, если он определен; иначе empty()
?
Optional<Integer> a = ...;
Optional<Integer> b = ...;
Optional<Integer> aOrB = a || b; // How to write this in Java 8+?
Я знаю, что могу написать a.orElse(12)
, но что, если значение по умолчанию также Optional
?
Очевидно, что в С# оператор ??
делает то, что я хочу.
Optional<Integer> aOrB = a.isPresent() ? a : b;
В java-9 вы можете следить за любыми из них:
✓ Просто подключите его, используя or
как: -
Optional<Integer> a, b, c, d; // initialized
Optional<Integer> opOr = a.or(() -> b).or(() -> c).or(() -> d);
реализована как
Если значение присутствует, возвращает
Optional
, описывающий значение, в противном случае возвращаетOptional
, созданный функцией подачи.
✓ Альтернативно, как указано @Holger, используйте stream
как: -
Optional<Integer> opOr = Stream.of(a, b, c, d).flatMap(Optional::stream).findFirst();
реализована как
Если значение присутствует, возвращается последовательный
stream
содержащий только это значение, в противном случае возвращает пустойstream
.
В java-8
у нас нет решения для простых цепей Optional
, но вы можете попробовать:
Stream.of(a, b)
.filter(op -> op.isPresent())
.map(op -> op.get())
.findFirst();
В java9
вы можете сделать:
Optional<Integer> result = a.or(() -> b);
Привет, вы можете сделать что-то вроде этого.
a.orEsle(b.orElse(null));
В java-8
, если вы хотите что-то рядом с механиком Optional::stream
, вы могли бы сделать
Stream.of(a, b)
.flatMap(x ->
x.map(Stream::of)
.orElse(Stream.empty())
)
.findFirst()