
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獲取更多資訊
