日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java Stream的基本概念以及創建方法

瀏覽:163日期:2022-08-25 18:40:04

前言

相信很多人(包括我自己),在很長一段時間內雖然使用了 JDK 1.8 ,卻從來沒有使用過自1.8開始增加的 Stream 這一強大使用的新特性,本文則將先從如何創建 Stream 開始,逐步去學會 Stream 的使用。本文不會涉及對流中數據的操作,而只討論創建流的幾種方法,以及一些基礎概念,關于流的實用操作將會在后續文章中一一介紹。

Stream 與 Collection 的區別

1.用途與關注點不同

Collection 主要關注于對象的存儲方面,通過使用 List 、 Map、Set等等數據結構,讓數據被更好的組織起來,以便于使用。而 Stream 則關注于對象的操作方面,包含reduce、map、filter等等實用的操作。

2.流是懶搜索(Laziness-seeking)的

先看一個例子,考慮一下代碼:

Random random = new Random(29);random.ints() .filter(v -> v > 5 && v < 31) .limit(3) .forEach(System.out::println);// output:// 21// 22// 28

代碼首先創建了一個隨機整數流,然后過濾得到其中在(5, 31)范圍內的數,最終得到其中的3個數并輸出,這里創建的流就是3中所說的無限流,而流在執行的過程中一旦得到一個滿足條件的整數就會加到結果序列中,并且開始進行下一輪的搜索,直到找到3個滿足的整數為止。流只會完成所給任務(找到3個滿足指定范圍的整數并輸出),不會有額外的操作。

3.流的大小可以是無限的

盡管 Collection 的數據量也可以動態擴展改變,但由于計算機內存是有限的,所以其數據量大小始終可以看成只能為有限的大小。但 Stream 則不同,由于流是懶加載的,所以當使用limit類似的短路操作時,就可以利用特性2的原因去接收一個無限流。

4.流操作不存在副作用

和 Collection 中的某些操作,例如remove會刪除集合中的元素不同,流不會修改生成流的原有集合中的數據,例如使用filter時,會產生一個經過元素過濾后的新流,而不會修改原集合中的數據。

5.流屬于消耗品(Consumable)

不同與 Collection 沒有訪問次數與使用的限制,一個流在其生命周期中只能被執行一次,當執行了終端操作(terminal operation,在之后的文章中會具體介紹)后,即使沒有將流關閉,例如上述代碼中的forEach,也無法再次訪問了(類似迭代器),如下代碼所示,想要再操作,必須重新創建一個流。

IntStream stream = new Random(29).ints();stream.filter(v -> v > 5 && v < 31) .limit(3) .forEach(System.out::println);// 當執行了終端操作后再使用,就會出現一下異常提示信息// java.lang.IllegalStateException: stream has already been operated upon or closedstream.forEach(System.out::println);

創建流

流可以通過很多種方式被創建,下面進行一一介紹:

1.Collection 家族創建的方式

對于實現了Collection 接口的類,都可以通過stream()和parallelStream()創建對應流,如下代碼所示:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));// 創建一個普通的流Stream<Integer> stream = list.stream();// 創建一個并行流Stream<Integer> parallelStream = list.parallelStream();

2.數組家族創建的方式

對于數組類型的元素,都可以使用Arrays類的stream()創建對應的流,如果想獲得并行流則需要使用parallel()方法,如下所示:

IntStream stream = Arrays.stream(new int[]{1, 2, 3});// 生成流對應的并行流IntStream parallelStream = stream.parallel();

3.Stream家族的工廠方法

通過工廠方法來創建流的方式比較多,可以通過empty、of、concat、generate、iterate、range、rangeClosed以及builder等方法創建流,下面就通過代碼樣例來一一介紹:

// 產生一個不包含任何元素的流Stream<Object> stream1 = Stream.empty();// 由給定元素所生成的流Stream<Integer> stream2 = Stream.of(1, 2, 3);// 合并兩個流產生一個新的流Stream<Object> stream3 = Stream.concat(stream1, stream2);// 創建一個<無限流>,流中的數據是通過調用所傳函數產生的Stream<Double> stream4 = Stream.generate(Math::random);// 創建一個<無限流>,流中的數據由第一個參數、將// 第一個參數作為函數參數調用產生的值以及不斷將// 函數調用得到的值作為參數繼續調用所組成,// 例如下面會生成1,2,3....的整數流Stream<Integer> stream5 = Stream.iterate(1, v -> v + 1);// 創建范圍為[1, 5)組成的整數流IntStream stream6 = IntStream.range(1, 5);// 創建范圍為[1, 5]組成的整數流IntStream stream7 = IntStream.rangeClosed(1, 5);// 通過流的建造者模式創建流Stream.Builder<Integer> builder = Stream.builder();for (int i = 0; i < 10; i++) { // add 與 accept 方法均可將元素添加到流中 // 區別是 add 無返回值, accept 會返回當前 builder 的 this 對象 // 底層 add 方法也是調用了 accept 然后返回 this // 因此對于 add 方法可以進行鏈式調用 builder.add(i); builder.accept(i);}Stream<Integer> stream8 = builder.build();

4.IO/NIO家族中的方法

除了兩種獲取lines生成的流外,其它幾種方式都很少使用,這一部分了解即可。

try { String dir = System.getProperty('user.dir'); // 以下兩種方法均是獲取文件中行數據組成的流 Stream<String> stream1 = new BufferedReader(new FileReader(dir + 'demo.txt')).lines(); Stream<String> stream2 = Files.lines(Paths.get(dir + 'demo.txt')); // 獲取指定路徑下所有文件/文件夾的路徑組成的流 Stream<Path> stream3 = Files.list(Paths.get('d:temp')); // 獲取指定路徑下以及指定最深文件層級內(在這里為2)且滿足函數條件的所有文件/文件夾的路徑組成的流 Stream<Path> stream4 = Files.find( Paths.get('d:temp'), 1, (path, basicFileAttributes) -> path.isAbsolute()); // 獲取指定路徑下以及指定最深文件層級內(在這里為2)所有文件/文件夾的路徑組成的流 Stream<Path> stream5 = Files.walk(Paths.get('d:temp'), 2);} catch (IOException e) { e.printStackTrace();}

5.Random 獲取流的方式

由于直接使用 Random 類生成隨機數無限流,均為基本數據類型組成的流,因此通常還需要使用boxed方法進行裝箱(以前凡是生成的為IntStream,DoubleStream,LongStream均同此),以便可以使用更加豐富的特性。

Random random = new Random();// 以下三種方式得到的均是隨機數組成的<無限流>IntStream stream1 = random.ints();DoubleStream stream2 = random.doubles();LongStream stream3 = random.longs();Stream<Integer> boxedStream = stream1.boxed();

下面就先舉一個具體的實用的例子,在之后的文章中會詳細介紹一些實用操作,這里可以先做了解:

// 對數組元素進行倒序排序// 如果不進行裝箱(boxed)處理,則只能使用默認的升序排序方法// 通過裝箱,則可以通過自定義比較器,實現更加多樣的排序int[] arr = {1, 5, 4, 6, 3, 9, 4, 5, 6, 4};int[] reverseArr = Arrays.stream(arr) .boxed() .sorted(Comparator.reverseOrder()) .mapToInt(Integer::valueOf) .toArray();// output: [9, 6, 6, 5, 5, 4, 4, 4, 3, 1]System.out.println(Arrays.toString(reverseArr));

6.其它可以生成流的類

除了以上介紹的幾個主要可以生成流的類之外,還有一些其它不太常見的可以流的類,下面是部分代碼展示:

String s = '1,2,3,4,5,6,7';// 由分割后的字符串組成的流// 在這里就是'1', '2', '3', '4', '5', '6', '7'組成的流Stream<String> stream1 = Pattern.compile(',').splitAsStream(s);BitSet bitSet = new BitSet();for (int i = 0; i < 10; i++) { if (i % 2 == 0) { bitSet.set(i); }}// 由 bitset 中被設置為 true 的位下標所組成的流// 在這里就是0, 2, 4, 6, 8IntStream stream2 = bitSet.stream();try { String dir = System.getProperty('user.dir'); JarFile jarFile = new JarFile(dir + 'demo.jar'); // 由指定 jar 包中所有文件及文件夾的 JarEntry 對象所組形成的流 Stream<JarEntry> stream3 = jarFile.stream();} catch (IOException e) { e.printStackTrace();}

此外還可以通過 StreamSupport工具類進行產生和操作流,由于本文包括之后的文章主要是為了入門和先簡單上手,所以這里不做詳細討論,感興趣的可以自己進行查閱資料。

總結

本文簡單介紹了 Stream 這個自1.8開始引入的新特性,然后簡單介紹了一些基本概念和流的創建方式,在接下來的文章中還會介紹流的一些實用操作,希望能和大家一起學會使用 Stream 這個實用的特性,當然本文也難免有錯誤之處,希望得到各位的指正。

以上就是Java Stream的基本概念以及創建方法的詳細內容,更多關于JAVA Stream的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久精品五月天| 日本成人在线不卡视频| 蘑菇福利视频一区播放| 日韩不卡视频在线观看| 成人在线超碰| 国产精品18| 国产精品高清一区二区| 日韩精品免费观看视频| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩国产一区二区| 午夜影院一区| 亚洲www啪成人一区二区| 九色porny丨国产首页在线| 色爱综合网欧美| 欧美日韩免费观看视频| 丝袜av一区| 秋霞影视一区二区三区| 久久亚洲成人| 久热精品在线| 国产精品最新| 激情黄产视频在线免费观看| 国产字幕视频一区二区| 99国产精品久久久久久久成人热 | 久久黄色影视| 国产精品美女在线观看直播| 久久免费精品| 成人自拍av| 石原莉奈一区二区三区在线观看| 亚洲午夜精品久久久久久app| 丝袜美腿亚洲一区| 久久av电影| 女同性一区二区三区人了人一| 日本久久一区| 欧美天堂视频| 亚洲va久久久噜噜噜久久| 国产精东传媒成人av电影| 日韩不卡视频在线观看| 亚洲精品乱码| 日韩理论视频| 日韩三区四区| 99久久精品费精品国产| 日韩av三区| 91九色精品国产一区二区| 亚洲尤物av| 美女网站视频一区| 国产精品中文| 男女精品网站| 亚洲精品国产嫩草在线观看 | 樱桃视频成人在线观看| 美日韩精品视频| 日韩中文首页| 久久99久久人婷婷精品综合| 夜久久久久久| 欧美国产美女| 国产精品xvideos88| 免费精品视频在线| 在线视频观看日韩| 亚洲一级少妇| 日韩电影免费在线观看| 国产精品白丝av嫩草影院| 日韩不卡在线观看日韩不卡视频 | 高清不卡一区| 国产欧美69| 国产欧美日韩免费观看| 深夜福利一区| 国产精品日韩久久久| 久久久久久免费视频| 岛国av在线网站| 福利视频一区| 九九九精品视频| 精品理论电影在线| 欧美91在线|欧美| 久久精品国产99国产| 久久精品九色| 色欧美自拍视频| 日韩成人亚洲| 日韩亚洲精品在线| 亚洲一区二区三区久久久| 亚洲久久视频| 91亚洲无吗| 欧美日韩夜夜| 福利视频一区| 999久久久亚洲| 亚洲一区欧美二区| 亚洲欧洲国产精品一区| 91精品日本| 国产成人精品999在线观看| 日韩一区欧美| 免费日韩av| 美女视频黄久久| 国内亚洲精品| 日韩精品视频网| 午夜av成人| 日本成人在线一区| 国产精品久久久久久久免费观看 | 91综合久久爱com| 欧美91在线| 米奇777超碰欧美日韩亚洲| 亚欧成人精品| 亚洲国产福利| 日本不卡视频一二三区| xxxxx性欧美特大| 日日摸夜夜添夜夜添国产精品| 国产精品a级| 国产亚洲精品久久久久婷婷瑜伽| 日韩制服丝袜先锋影音| 久久丁香四色| 麻豆成人在线| 黄色在线网站噜噜噜| 日韩中文字幕无砖| 久久久夜夜夜| 久久精品国产久精国产爱| 一区二区电影在线观看| 成人va天堂| 国产一区二区三区黄网站| 亚洲精品美女91| 激情婷婷久久| 久久影院午夜精品| 国产探花一区| 婷婷亚洲成人| 免费毛片在线不卡| 日韩高清成人| 高清av一区| 久久免费精品| 国产日韩免费| 日韩和欧美一区二区| 一区二区三区午夜视频| 久久性天堂网| 午夜在线视频观看日韩17c| 久久久国产亚洲精品| 91视频久久| 欧美国产小视频| 欧美成人a交片免费看| 精品在线网站观看| 久久天堂影院| 国产福利一区二区三区在线播放| 亚洲精品观看| 国产欧美日韩一区二区三区在线| 婷婷五月色综合香五月| 日本精品另类| 国产精品magnet| 国产精品久久观看| 日韩免费福利视频| 国户精品久久久久久久久久久不卡 | 99久久精品网| 欧美日韩国产综合网| 欧美日韩一二三四| 一区视频在线| 青青草精品视频| 精品国产乱码久久久| 久久青草久久| 蜜臀久久99精品久久久久宅男| 亚洲一区二区三区久久久| 国产精品久久久久久久久久齐齐 | 噜噜噜久久亚洲精品国产品小说| 毛片在线网站| 蜜桃成人av| 日韩精品免费视频一区二区三区| 国产精选久久| 亚洲无线一线二线三线区别av| 免播放器亚洲| 日韩a一区二区| 亚洲欧洲日本mm| 国产麻豆一区| 欧美日韩国产一区二区三区不卡| 免费视频久久| jizzjizz中国精品麻豆| 免费日韩av片| 美女毛片一区二区三区四区 | 欧美精品成人| 国产精品普通话对白| 精品一区二区三区中文字幕| 日韩专区在线视频| 精品日韩视频| 精品在线网站观看| 91亚洲精品视频在线观看| 欧美精品自拍| 久久九九99| 97精品国产一区二区三区 | xxxxx性欧美特大| 国产精品密蕾丝视频下载| 亚洲欧美网站在线观看| 精品捆绑调教一区二区三区| 奇米色欧美一区二区三区| 久久爱www成人| 国产日韩中文在线中文字幕| 久久午夜精品一区二区| 午夜精品一区二区三区国产| 91亚洲国产| 日韩欧美网址| 国产精品av一区二区| 国产精品av久久久久久麻豆网| 蜜臀国产一区| 免费观看久久av| 在线观看免费一区二区| 美女亚洲一区| 亚洲少妇自拍| 午夜在线精品偷拍| 综合亚洲自拍| 国产亚洲一区二区三区啪|