Как я кратко пишу || b где 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?

Очевидно, что в С# оператор ?? делает то, что я хочу.

Ответ 1

Optional<Integer> aOrB =  a.isPresent() ? a : b;

Ответ 2

В вы можете следить за любыми из них:

✓ Просто подключите его, используя 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.

Ответ 3

В java-8 у нас нет решения для простых цепей Optional, но вы можете попробовать:

Stream.of(a, b)
    .filter(op -> op.isPresent())
    .map(op -> op.get())
    .findFirst();

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

Optional<Integer> result = a.or(() -> b);

Ответ 4

Привет, вы можете сделать что-то вроде этого.

a.orEsle(b.orElse(null));

Ответ 5

В java-8, если вы хотите что-то рядом с механиком Optional::stream, вы могли бы сделать

Stream.of(a, b)
  .flatMap(x -> 
     x.map(Stream::of)
      .orElse(Stream.empty())
  )
  .findFirst()