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上找到本文的完整源代碼和所有代碼片段。
0 條評論,你可以發表評論,我們會進行改進
