Java-8 Stream findFirst() 和 findAny()

  • Post author:
  • Post category:java


Java-8 Stream findFirst() 和 findAny()

Java-8

1.简介

Java 8 Stream API引入了两种经常被误解的方法:findAny()和findFirst()。

在本教程中,我们将研究这两种方法之间的区别以及何时使用它们。

  1. 使用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_whenFindAnyResultIsNotFirst_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)));
}
  1. 使用Stream.findFirst()

    findFirst()方法查找Stream中的第一个元素。 当您特别需要序列中的第一个元素时,可以使用此方法。

某些流的返回的元素是有确定顺序的,我们称之为 encounter order。这个顺序是流提供它的元素的顺序,比如数组的encounter order是它的元素的排序顺序,List是它的迭代顺序(iteration order),

但是对于HashSet,它本身就没有encounter order。

所以如果流没有encounter order的时候,它返回Stream中的任何元素。

java.util.streams包文档:

Streams may or may not have a defined encounter order. It depends on the source and the intermediate operations.

一个流是否是encounter order主要依赖数据源和它的中间操作。

返回类型也是一个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方法的行为在并行方案中也不会更改。 如果是encounter order,则它将始终具有确定性。

  1. 结论

    在本教程中,我们研究了Java 8 Streams API的findAny() 和findFirst()方法。 findAny()方法返回Stream中的任何元素,而findFirst()方法返回Stream中的第一个元素。

转:https://www.ripjava.com/article/1287205421056032