Прежде всего ваш текущий код содержит скрытую неочевидную ошибку .Операция Optional::get
вызовет исключение, когда встретится пустое Optional
.Сначала вы должны отфильтровать пустые опции:
// ...
.filter(Optional::isPresent)
.map(Optional::get)
// ...
Или, если вы используете java-9
или выше, вы можете просто отобразить дополнительные значения:
// ...
.flatmap(Optional::stream)
// ...
Что касается вашего вопроса, похоже, вам нужно reduce
с функцией слияния .Есть несколько способов определить эту функцию:
Ссылка на метод:
private Model merge(Model model1, Model model2) {
// merge model2 to model1
return model1;
}
Model model = models2.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.map(this::convert)
.reduce(this::merge)
.orElse(defaultModel);
A BinaryOperator
, хранящиеся в переменной:
BinaryOperator<Model> merge = (model1, model2) -> { /* do smth */; return model1;}
// ...
.map(this::convert)
.reduce(merge)
//
Встроенный lambda
// ...
.map(this::convert)
.reduce((model1, model2) -> { /* do smth */; return model1;})
//
ИМХО первый вариант самый лучший.Наличие отдельного метода сделает ваш код чище и проще в обслуживании.