在 Java 中使用空流
一、概述
在這個簡短的教程中,我們將快速了解 Java Stream
中的中間操作和終端操作、創建空Stream
的一些方法以及如何檢查空Stream
。
2. Stream
和Stream
Operations
Stream
API 是 Java 8 的主要特性之一Stream
是我們可以對其進行迭代和執行操作的一系列元素。
Stream
操作具體分為兩種類型——中間和終端。中間和終端操作可以鏈接在一起以形成流管道。
顧名思義,終端操作出現在流管道的末尾並返回諸如distinct()
之類的結果或產生諸如forEach()
之類的副作用。
另一方面,中間操作(例如sorted(),
將一個Stream
轉換為另一個Stream
。因此,我們可以鏈接多個中間操作。
任何終端或中間操作實際上都不會更改Stream
的源,但會產生結果。此外,中間操作以惰性方式執行;計算僅在啟動終端操作後執行。
讓我們看一個例子:
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6);
int sumOfEvenNumbers = numbers
.filter(number -> number%2 == 0)
.reduce(0, Integer::sum);
Assert.assertEquals(sumOfEvenNumbers, 12);
在這裡,我們創建了一個整數Stream
。我們使用了一個中間操作filter()
來創建另一個偶數Stream
。最後,我們使用了終端操作reduce()
來獲取所有偶數的總和。
3. 在 Java 中創建一個空Stream
有時,我們可能需要將Stream
作為參數傳遞給方法或從方法中返回一個。空Stream
可用於處理NullPointerException
。此外,一些Stream
操作,例如findFirst()
、 findAny()
、 min()
和max(),
檢查空Stream
並相應地返回結果。
有多種創建Stream
的方法。因此,也有多種方法可以創建空Stream
。
首先,我們可以簡單地使用Stream
類的empty()
方法:
Stream<String> emptyStream = Stream.empty();
empty()
方法返回一個空的String
類型的順序Stream
。
我們還可以使用of()
方法創建任何類型的空 Stream 。 of()
方法返回一個順序有序的Stream
,其中包含作為參數傳遞給它的元素。如果我們不傳遞任何參數,它會返回一個空的Stream
:
Stream<String> emptyStr = Stream.of();
同樣,我們可以使用IntStream
創建原始類型的Stream
:
IntStream intStream = IntStream.of(new int[]{});
Arrays
類有一個方法stream()
,它接受一個數組作為參數,並返回一個與參數類型相同的Stream
。我們可以通過傳遞一個空array
作為參數來使用它來創建一個空的Stream
:
IntStream emptyIntStream = Arrays.stream(new int[]{});
最後,我們可以使用List
或Set
等Collection
的stream()
方法來創建一個空的Stream
。空集合將創建一個空Stream
:
Stream<Integer> emptyIntStream = new ArrayList<Integer>().stream();
4. 檢查空Stream
我們可以通過簡單地使用一種短路終端操作(例如findFirst()
或findAny()
來檢查空Stream
:
Stream<String> emptyStream = Stream.empty();
assertTrue(emptyStream.findAny().isEmpty());
在這裡,如果流為空,則findFirst()
返回一個空的Optional
。然後我們檢查Optional
中是否存在值。由於Stream
為空,因此Optional
中不存在任何值,並且它返回false
。
但是,**我們必須記住,我們只能對Stream
進行一次操作。如果我們重用Stream
,我們可能會遇到一個IllegalStateException
**說:
IllegalStateException: stream has already been operated upon or closed.
因此,我們只能執行一個消耗**Stream.**
如果我們想重用Stream
,我們必須處理這個IllegalStateException
。
為了解決這個問題,我們可以在需要檢查其是否為空時使用Supplier
功能接口創建一個新的Stream
:
Supplier<Stream<Integer>> streamSupplier = Stream::of;
Optional<Integer> result1 = streamSupplier.get().findAny();
assertTrue(result1.isEmpty());
Optional<Integer> result2 = streamSupplier.get().findFirst();
assertTrue(result2.isEmpty());
在這裡,我們首先定義了一個空的Stream
。然後我們創建了一個 StreamstreamSupplier
對象Stream<Integer>.
因此,每次調用get()
方法都會返回一個新的空Stream
對象,我們可以在該對像上安全地執行另一個Stream
操作。
5.結論
在這篇簡短的文章中,我們看到了在 Java 中創建空Stream
的一些方法。我們還探討瞭如何檢查Stream
是否為空以及如何多次重用Stream
,同時避免在Stream
已經關閉或操作時拋出著名的IllegalStateException
。
與往常一樣,本文隨附的源代碼可在 GitHub 上獲得。