如何在Java中獲取流的最後一個元素?
1.概述
Java Stream
API是Java 8版本的主要功能。 Streams
表示對象的延遲評估序列,並提供豐富,流暢且類似於Monadic的API。
在本文中,我們將快速了解獲取Stream.
的最後一個元素的方法Stream.
請記住,由於流的性質,這不是自然的操作。始終確保您沒有使用無限Streams.
2.使用Reduce
API
簡而言之, Reduce
可以將Stream
的元素集減少為單個元素。
在這種情況下,我們將減少元素集以獲取Stream.
的最後一個元素Stream.
請記住,此方法將只為順序Streams.
返回確定性結果Streams.
讓我們使用String
值List
,從List
獲取Stream
,然後減少:
List<String> valueList = new ArrayList<>();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");
Stream<String> stream = valueList.stream();
stream.reduce((first, second) -> second)
.orElse(null);
在此,流減少到只剩下最後一個元素的水平。如果流為空,它將返回一個null
值。
2.使用跳過功能
獲取流的最後一個元素的另一種方法是跳過流之前的所有元素。這可以使用Stream
類的Skip
函數來實現。請記住,在這種情況下,我們消耗了Stream
兩次,因此對性能有明顯的影響。
讓我們創建一個字符串值List
,並使用其size
函數確定要跳過多少元素才能到達最後一個元素。
這是使用skip
獲取最後一個元素的示例代碼:
List<String> valueList = new ArrayList<String>();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");
long count = valueList.stream().count();
Stream<String> stream = valueList.stream();
stream.skip(count - 1).findFirst().get();
“Sean”
最終成為最後一個元素。
4.獲取無限流的最後一個元素
試圖獲取無限流的最後一個元素將導致對無限元素執行的無限評估序列。除非我們使用limit
操作將無限流限制為特定數量的元素,否則skip
和reduce
都不會從評估的執行中返回。
這是示例代碼,在其中我們獲取了無限的流並嘗試獲取最後一個元素:
Stream<Integer> stream = Stream.iterate(0, i -> i + 1);
stream.reduce((first, second) -> second).orElse(null);
因此,該流將不會從評估中返回,並且最終將終止程序的執行。
5.結論
我們看到了使用reduce
和Skip
API獲取Stream
的最後一個元素的不同方法。我們還研究了無限流為什麼無法做到這一點。
我們看到,與從其他數據結構中獲取元素相比,從Stream
中獲取最後一個元素並不容易。這是由於Streams
的惰性,除非調用終端函數,否則Streams
不會被評估,而我們永遠不知道當前評估的元素是否是最後一個元素。