Код: Выделить всё
Optional mapOr(Optional optional1, Optional optional2, BinaryOperator fun)
if(optional1.isPresent() && optional2.isPresent()) {
return Optional.of(fun.apply(optional.get(), optional2.get()));
} else {
return optional1.or(() -> optional2);
}
}
< /code>
(я бы никогда не хотел писать код таким образом; я просто выкладываю семантику.) Я хочу в конечном итоге первым, прививаясь на второе, через какую-то гипотетическую функцию this.link (…) Код: Выделить всё
Optional linkedList = mapOr(optionalElement1, optionalElement2, this::link);
< /code>
более функциональный подход реализации может быть: < /p>
Optional mapOr(Optional optional1, Optional optional2, BinaryOperator fun) {
return optional1.map(o1 -> optional2.map(o2 -> fun.apply(o1, o2))
.or(() -> optional1)).or(() -> optional2);
}
< /code>
Но это отвратительно. < /p>
Есть ли какая -то общая функциональная парадигма, которую я здесь не хватает? Это почти напоминает мне операцию по сокращению потока, это примерно так: < /p>
Optional mapOr(Optional optional1, Optional optional2, BinaryOperator fun) {
return Stream.of(optional1, optional2)
.filter(Optional::isPresent)
.map(Optional::get)
.reduce(fun);
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... th-a-value