Java 8 Stream findFirst()與findAny()

1.簡介

Java 8 Stream API引入了兩種經常被誤解的方法: findAny()findFirst()

在本快速教程中,我們將研究這兩種方法之間的區別以及何時使用它們。

2.使用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)));

 }

3.使用Stream.findFirst()

findFirst()方法查找Stream.的第一個元素Stream.顯然,當您特別需要序列中的第一個元素時,將使用此方法。

如果沒有遇到順序,它將從Stream返回任何元素。 java.util.streams軟件包文檔說:

流可能具有也可能沒有定義的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方法的行為不會改變。如果遇到順序存在,它將始終具有確定性。

4。結論

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

您可以在GitHub上找到本文的完整源代碼和所有代碼片段。