如何中止迭代Java Stream forEach
過濾Java中的可選流
Java 8並行流中的自定義線程池
合併Java流
map()和flatMap()之間的區別
Java流的字符串操作
如何使用索引迭代流
Java中將迭代器轉變爲流
如何在Java中獲取流的最後一個元素?
將字符串轉換為字符流
Java中的“流已被操作或關閉”異常
Java 8和無限流
如何向流中添加單個元素
Java 8中的原始類型流
在Java Stream API中有所不同
Java 9 Stream API的改進
Java Spliterator簡介
如何在Java 8流中使用if / else邏輯
Java 8謂詞鏈
具有Lambda表達式的Java流過濾器
用Java流求和
Java 8 Streams peek() API
與Map一起使用流
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上找到本文的完整源代碼和所有代碼片段。