Новая инфраструктура Java-8 и друзья делают для очень сжатого Java-кода, но я столкнулся с кажущейся простой ситуацией, которая сложнее сделать в сжатом виде.
Рассмотрим a List<Thing> things
и метод Optional<Other> resolve(Thing thing)
. Я хочу сопоставить Thing
с Optional<Other>
и получить первый Other
. Очевидным решением было бы использовать things.stream().flatMap(this::resolve).findFirst()
, но flatMap
требует, чтобы вы вернули поток, а Optional
не имеет метода stream()
(или это Collection
) или предоставить метод его преобразования или просмотреть его как Collection
).
Лучшее, что я могу придумать, это следующее:
things.stream()
.map(this::resolve)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
Но это кажется ужасно затянутым для того, что кажется очень распространенным случаем. У кого-нибудь есть лучшая идея?