Java流.只有一次

Kim*_*ims 3 java java-8

在我的过滤器为真后,有没有办法让我的流只迭代一次?

例:

list.stream()
    .filter(ele -> ele.isBlue())
    .map(Element::getSomething)
    .collect(toList());
Run Code Online (Sandbox Code Playgroud)

假设我的列表中有很多元素,但只有一个是蓝色的.我知道只有一个是蓝色的,但我不知道它在哪里.为了论证,让我们说isBlue()是一个缓慢的方法,所以我想在它击中一次时停止.

Kay*_*man 7

如果您只查找一个元素,而不是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()返回它找到的任何单个合适的元素).


Eug*_*ene 5

你仍然可以collect,但有一个limit:

list.stream()
   .filter(ele -> ele.isBlue())
   .map(Element::getSomething)
   .limit(1)
   .collect(toList());
Run Code Online (Sandbox Code Playgroud)

  • @Kayaman:虽然,`findFirst().map(Collections :: singletonList).orElseGet(Collections :: emptyList)`并没有那么复杂,而且有一些整洁的属性...... (3认同)
  • 如果您执行需要集合的其他工作,这非常有用,因此您无需手动将"Optional"的内容放入新列表中. (2认同)
  • @Holger当然,不仅有一种方法可以给猫皮肤. (2认同)