Stream
Java8中的集合支持一個(gè)新的stream方法婆瓜,它會(huì)返回一個(gè)流(接口定義在java.util.stream.Stream里)。你在后面會(huì)看到绒极,還有很多其他的方式可以得到流毁欣,比如利用數(shù)值范圍或從I/O資源生成流元素。
流的數(shù)據(jù)處理功能支持類(lèi)似于數(shù)據(jù)庫(kù)的操作忌锯,以及函數(shù)式編程語(yǔ)言中的常用操作,如filter,map,reduce,find,match,sort等领炫。流操作可以順序執(zhí)行偶垮,也可以并并行執(zhí)行。
流操作有兩個(gè)重要的特點(diǎn)帝洪。
- 流水線(xiàn)——很多流操作本身會(huì)返回一個(gè)流似舵,這樣多個(gè)操作就可以鏈接起來(lái),形成一個(gè)大的流水線(xiàn)葱峡。
- 內(nèi)部迭代——與使用迭代器顯示迭代的集合不同砚哗,流的迭代操作是在背后進(jìn)行的。
流與集合
只能遍歷一遍
和迭代器類(lèi)似砰奕,流只能遍歷一次蛛芥。遍歷完成之后提鸟,我們就說(shuō)這個(gè)流已經(jīng)被消費(fèi)掉了。你可以從原始數(shù)據(jù)源哪里再獲得一個(gè)新的流來(lái)重新遍歷一遍仅淑,就像迭代器一樣称勋。例如,以下代碼會(huì)拋出一個(gè)異常漓糙,說(shuō)流已經(jīng)被消費(fèi)掉了:
List<String> title = Arrays.asList("java8","In","Action");
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println);//java.lang.IllegalStateException:流已經(jīng)被操作活關(guān)閉。
所以要記得烘嘱,流只能消費(fèi)一次昆禽。