Новая инфраструктура 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();
Но это кажется ужасно затянутым для того, что кажется очень распространенным случаем. У кого-нибудь есть лучшая идея?
