在我的过滤器为真后,有没有办法让我的流只迭代一次?
例:
list.stream()
.filter(ele -> ele.isBlue())
.map(Element::getSomething)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
假设我的列表中有很多元素,但只有一个是蓝色的.我知道只有一个是蓝色的,但我不知道它在哪里.为了论证,让我们说isBlue()是一个缓慢的方法,所以我想在它击中一次时停止.
如果您只查找一个元素,而不是collect()使用findFirst()/ findAny().
Optional<Something> s = list.stream()
.filter(ele -> ele.isBlue())
.map(Element::getSomething)
.findAny();
Run Code Online (Sandbox Code Playgroud)
然后你得到一个Optional包含单个蓝色元素,或者为空Optional.
简单流之间findFirst()和之间没有区别findAny(),只有在涉及并行性时(findFirst()确定性地返回第一个元素,并findAny()返回它找到的任何单个合适的元素).
你仍然可以collect,但有一个limit:
list.stream()
.filter(ele -> ele.isBlue())
.map(Element::getSomething)
.limit(1)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)