Java 流、过滤器,然后对结果集合执行某些操作

Jos*_* M. -2 java java-stream

目标

final List<T> listOfThings = ...;

listOfThings.stream()
    .filter(...) // returns a Stream<T>
    .then(filteredListOfThings -> {
        // How do I get here so I can work on the newly filtered collection
        // in a fluent way w/out collecting the result to a variable?
        // For example, if I need to process the elements but don't 
        // care about them in their current form outside this chain.
    });
Run Code Online (Sandbox Code Playgroud)

问题

在英语中,给定一个列表,我想流式传输列表,过滤它,然后对整个过滤结果进行操作。我可以用 optional 来完成这个,但它不是干净的 IMO:

final List<T> listOfThings = ...;

Optional
    .of(listOfThings.stream()
        .filter(...) // returns a Stream<T>
        .collect(Collectors.toList()))
    .map(filteredListOfThings -> {
        // I'm here, now, but would like to not have to wrap it in an Optional<T>
    });
Run Code Online (Sandbox Code Playgroud)

如果 a 上有一个then或类似的方法Stream<T>返回Stream<T>以允许进一步链接,这会很酷,这允许我在 lambda 中处理整个结果集而无需声明外部变量。

And*_*ner 5

不要让它变得比需要的更复杂。

将结果赋给collect一个变量,然后对该变量进行操作:

List<T> filteredListOfThings = ... .collect(toList());

// Now use filteredListOfThings.
Run Code Online (Sandbox Code Playgroud)

filteredListOfThings总会有一个值,即使它是空列表,所以使用Optional.

filteredListOfThings作为 lambda 参数和作为显式变量之间没有太大的语法差异;但是您在处理它时可以做的事情有更大的灵活性(从方法返回,抛出已检查的异常等)。