本文將講解Java 8 Stream中的兩個方法:skip()
和limit()
。這兩個方法是Stream
很經常使用的,不只各自會被高頻使用,還能夠組合出現,並能實現一些小功能,如subList
和分頁等。java
見名知義,skip()
方法用於跳過前面n個元素,而後再返回新的流,如圖所示:微信
來看看代碼:性能
List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6) .skip(4) .collect(Collectors.toList()); List<Integer> expected = asList(5, 6); assertEquals(expected, result);
方法skip()
的參數n的四種狀況:3d
(1)當n<0
時,拋IllegalArgumentException
異常;code
(2)當n=0
時,至關沒有跳過任何元素,原封不動、完璧歸趙;blog
(3)當0<n<length
時,跳過n個元素後,返回含有剩下的元素的流;接口
(4)當n>=length
時,跳過全部元素,返回空流。ip
對於limit()
方法,它是用於限制流中元素的個數,即取前n個元素,返回新的流,如圖所示:it
代碼以下:io
List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6) .limit(4) .collect(Collectors.toList()); List<Integer> expected = asList(1, 2, 3, 4); assertEquals(expected, result);
方法limit()
的參數n的四種狀況:
(1)當n<0
時,拋IllegalArgumentException
異常;
(2)當n=0
時,不取元素,返回空流;
(3)當0<n<length
時,取前n個元素,返回新的流;
(4)當n>=length
時,取全部元素,原封不動、完璧歸趙。
流Stream分爲有限流和無限流,前面的例子咱們都是使用的有限流,與Java集合類不一樣,流是能夠無限的。對於無限流,skip()
和limit()
表現出了極大的差別,先上代碼:
Stream.iterate(1, i -> i + 1) .filter(num -> (num & (num - 1)) == 0) .limit(10) .forEach(System.out::println); System.out.println("----------------"); Stream.iterate(1, i -> i + 1) .filter(num -> (num & (num - 1)) == 0) .skip(10) .forEach(System.out::println);
執行後發現,limit()
是能夠將無限流轉化爲有限流的,因此咱們也能夠認爲它是一個短路操做。而skip()
則不行,無論你跳過了前面多少個元素,總仍是會有源源不斷的元素過來,沒法收斂。
上述代碼的結果是:
經過limit()
輸出了前十個2的n次方值: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
而skip()
而跳過了前10個,繼續輸出,但會不斷執行下去(會有int的溢出現象):
1024, 2048, 4096, 8192, 16384, 32768...
除了二者各自有各自的功能外,咱們經過組合使用,能夠實現其它功能。
集合類如List
是有subList()
這個方法的,能夠截取List中的某一部分,這個功能還能夠經過組合skip()
和limit()
使用獲得,以下面代碼:
List<Integer> list = asList(1, 2, 3, 4, 5, 6, 7, 8, 9); List<Integer> expected = list.subList(3, 7); List<Integer> result = list.stream() .skip(3) .limit(7 - 3) .collect(Collectors.toList()); assertEquals(expected, result);
將subList(startIndex, endIndex)
轉換成skip(startIndex).limit(endIndex - startIndex)
。
能夠經過組合使用skip()
和limit()
進行分頁,以下面代碼:
int pageSize = 10; int pageIndex = 7; List<Integer> expected = asList(61, 62, 63, 64, 65, 66, 67, 68, 69, 70); List<Integer> result = Stream.iterate(1, i -> i + 1) .skip((pageIndex - 1) * pageSize) .limit(pageSize) .collect(Collectors.toList()); assertEquals(expected, result);
上面代碼例子是獲取了第七頁數據,每頁大小爲10。
本文介紹了Java 8的Stream
接口中兩個經常使用的方法:skip()
和limit()
,比較簡單易懂,也介紹了怎麼組合使用。須要注意的是,若是Stream
過大或是無限流,當心skip()
會有性能問題。
歡迎關注公衆號<南瓜慢說>,將持續爲你更新...
歡迎加博主微信,作一個點贊之友,哈哈...
多讀書,多分享;多寫做,多整理。