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)。
- 流水線——很多流操作本身會(huì)返回一個(gè)流,這樣多個(gè)操作就可以鏈接起來(lái),形成一個(gè)大的流水線。
- 內(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)一次。