Карта два Java `optunal` или создайте тот, у кого есть значениеJAVA

Программисты JAVA общаются здесь
Anonymous
Карта два Java `optunal` или создайте тот, у кого есть значение

Сообщение Anonymous »

Есть ли метод Java или краткий подход для объединения двух дополнительных экземпляров с использованием функции отображения, если оба присутствуют; В противном случае создайте одно или другое, которое имеет значение?

Код: Выделить всё

 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);
}
Что круто в этом подходе, так это то, что он может быть обобщен до любого количества дополнительных s. (Хотя я скептически относится к его производительности.) Все равно мне пришлось бы создать метод утилиты - я бы не хотел использовать что -то, что словесное снова и снова (и мне нужно использовать его в нескольких местах). Позже я понял, что могу преобразовать необязательные s в потоках, сознавать их, а затем выполнить уменьшение (как Haller упоминает в одном из ответов); Это было бы немного красивым функциональным программированием, но все же довольно многословное. Вместо ссылки (ссылка (ссылка (1, 2), 3), 4) , мне нужна ссылка (1, ссылка (2, ссылка (3, 4))) . Дальнейшие исследования показывают, что я хочу, чтобы «правая складка». Я не сразу вижу операцию правого потока сгиба в Java. Тем не менее, это будет работать только с двумя значениями.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... th-a-value

Вернуться в «JAVA»