findFirst 在流上<可选<T>>

jwi*_*ner 6 java java-stream option-type

假设您有一个流Optional<T>,您想要触发一个Consumer<T>流(如果存在)。

处理这个问题最优雅的方法是什么?

我可以通过过滤Optional::isPresent和映射来进行管理Optional::isGet,但这看起来很“hacky”并且不符合以下精神Optional

Stream.of(a, b, c, d)
   .filter(Optional::isPresent)
   .map(Optional::get)
   .findFirst()
   .ifPresent(s -> System.out.println("This was cumbersome: " + s));
Run Code Online (Sandbox Code Playgroud)

spr*_*ter 7

我同意这很麻烦,但它可能是最直接的解决方案,而不会变得更麻烦。

我在类似情况下做过的一件事是创建一种方法将 an 转换Optional为 a Stream

private Stream<T> optionalStream(Optional<T> optional) {
    if (optional.isPresent())
        return Stream.of(optional.get());
    else
        return Stream.empty());
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用flatMap

Stream.of(a, b, c, d)
    .flatMap(this::optionalStream).findFirst()...
Run Code Online (Sandbox Code Playgroud)

从 Java 9 开始,Stream添加了该方法Optional来执行此操作,因此您可以使用:

Stream.of(a, b, c, d)
    .flatMap(Optional::stream)
    .findFirst()...
Run Code Online (Sandbox Code Playgroud)

但说实话,我不确定这是否比您filter当时的map解决方案简单得多。