目标
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 中处理整个结果集而无需声明外部变量。
不要让它变得比需要的更复杂。
将结果赋给collect一个变量,然后对该变量进行操作:
List<T> filteredListOfThings = ... .collect(toList());
// Now use filteredListOfThings.
Run Code Online (Sandbox Code Playgroud)
filteredListOfThings总会有一个值,即使它是空列表,所以使用Optional.
filteredListOfThings作为 lambda 参数和作为显式变量之间没有太大的语法差异;但是您在处理它时可以做的事情有更大的灵活性(从方法返回,抛出已检查的异常等)。