1. 前言
Java 8 Stream API 中的skip()
和limit()
方法具有類似的作用。它們都是對流進行裁剪的中間方法。今天我們來探討一下這兩個方法。
2. skip()
skip(lang n)
是一個跳過前 n
個元素的中間流操作。我們編寫一個簡單的方法來進行skip
操作,將流剩下的元素打印出來。
public static void skip(long n) {
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
integerStream.skip(n).forEach(integer -> System.out.println("integer = " integer));
}
經過測試,當 n < 0
時直接拋出了 IllegalArgumentException
異常。畢竟要跳過一些元素,跟下象棋一個道理不能后退只能向前。當 n=0
時,原封不動完璧歸趙。這種操作一般我們不會主動搞,沒有意義。當 n=4
時,打印了 5
和 6
,由此可推斷當我們取值大於等於流的大小時肯定什么也沒有了,對於流來說肯定是個空流。經過檢驗確實count=0
。
也就是說 skip(long n)
方法跳過前 n
(非負)個元素,返回剩下的流,有可能為空流。
3. limit()
limit(long maxsize)
我們也如法炮制:
public static void limit(long maxsize) {
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
integerStream.limit( maxsize).forEach(integer -> System.out.println("integer = " integer));
}
當 n < 0
時直接拋出了 IllegalArgumentException
異常。當 n=0
時,返回一個空流。當 n=4
時,打印了 1
、 2
、3
、 4
。 n=8
時,打印了所有元素。感覺跟 mysq的分頁有異曲同工之妙。
4. 區別
這兩個方法都是截取了流。但是它們有一些區別 skip
操作必須時刻監測流中元素的狀態。才能判斷是否需要丟棄。所以 skip
屬於狀態操作。
而 limit
只關心截取的是不是其參數 maxsize
(最大區間值),其它毫不關心。一旦達到就立馬中斷操作返回流。所以 limit
屬於一個中斷操作。
5. 總結
今天對Java Stream API 的 skip()
和limit()
方法進行了探討。不知道你會想到在什么場景下會分別用到它們呢,不妨留言告訴我。
關注公眾號:Felordcn獲取更多資訊