Uso de Java 8 opcional con Stream :: flatMap
El nuevo marco de transmisión Java 8 y sus amigos crean un código Java muy conciso, pero me he encontrado con una situación aparentemente simple que es difícil de hacer de manera concisa.
Considera unList<Thing> things
y métodoOptional<Other> resolve(Thing thing)
. Quiero mapear elThing
s aOptional<Other>
sy obtener el primeroOther
. La solución obvia sería usarthings.stream().flatMap(this::resolve).findFirst()
, peroflatMap
requiere que devuelva una secuencia yOptional
no tiene unstream()
método (o es unCollection
o proporcionar un método para convertirlo o verlo como unCollection
)
Lo mejor que se me ocurre es esto:
things.stream()
.map(this::resolve)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
Pero eso parece terriblemente largo para lo que parece un caso muy común. Alguien tiene una mejor idea?