添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
安静的棒棒糖  ·  vue.js - ...·  1 年前    · 
狂野的充值卡  ·  cmake 编译32位-掘金·  1 年前    · 

最近,写法采用Java 8 Stream API引入两种经常被误解的方法: findAny() findFirst() 。 再次这两种方法之间的区别以及何时使用他进行做个笔记,

使用Stream.findAny()

findAny() 方法允许您从Stream中找到任何元素,在寻找元素而无需注意相遇顺序是使用他。该方法返回一个Optional实例,如果Stream为空,则改实例为空。

@Test
public void createStream_whenFindAnyResultIsPresent_thenCorrect() {
    List<String> list = Arrays.asList("A","B","C","D");
    Optional<String> result = list.stream().findAny();
    assertTrue(result.isPresent());
    assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D")));

在并行操作中,他可能会返回Stream中的第一个元素,但是对策不能保证。为了在处理并行操作时获得最佳性能,无法可靠地确定结果:

@Test
public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect()() {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Optional<Integer> result = list
      .stream().parallel()
      .filter(num -> num < 4).findAny();
    assertTrue(result.isPresent());
    assertThat(result.get(), anyOf(is(1), is(2), is(3)));

使用Stream.findFirst()

在使用findFirst()方法查找在第一元素流。特别需要序列中的第一个元素时,将使用此方法。如果没有遇到顺序,他将从Stream返回任何元素。该`java.util.stream``包文件说:

流可能具有也可能没有定义的遇到顺序,他取决于源和中间操作

返回类型也是Optional实例,如果Stream也为空,则该实例也为空:

@Test
public void createStream_whenFindFirstResultIsPresent_thenCorrect() {
    List<String> list = Arrays.asList("A", "B", "C", "D");
    Optional<String> result = list.stream().findFirst();
    assertTrue(result.isPresent());
    assertThat(result.get(), is("A"));

在并行方案中,findFirst()方法的行为不会更改。如果遇到顺序存在,它将始终具有确定性。

  • findAny()方法返回从任何元素流而使用
  • findFirst()方法返回在第一个元素流
  • Java 8 Stream findFirst()与findAny()

  • 私信
  •