stream初體驗
stream是java8中操作集合的一個重要特性,我們先來看看java里面是怎么定義stream的:
"a sequence of elements supporting sequential and parallel aggregate operations."
我們來解讀一下上面的那句話:
1、stream是元素的集合,這點讓stream看起來用些類似iterator;
2、可以支持順序和并行的對原stream進行匯聚的操作。
stream的創(chuàng)建方式有很多種,除了最常見的集合創(chuàng)建,還有其他幾種方式。
list轉(zhuǎn)stream
list繼承自collection接口,而collection提供了stream()方法。
1
2
|
list<integer> list = lists.newarraylist( 1 , 2 , 3 ); stream<integer> stream = list.stream(); |
數(shù)組轉(zhuǎn)stream
對于數(shù)組,arrays提供了stream()方法。
1
2
|
string[] arr = new string[]{ "a" , "b" , "c" }; stream<string> stream = arrays.stream(arr); |
map轉(zhuǎn)stream
map并不是一個序列,不是集合,沒辦法直接轉(zhuǎn)成stream(). 但entryset()是set,可以轉(zhuǎn)
1
2
|
map<string, object> map = maps.newhashmap(); stream<entry<string, object>> stream = map.entryset().stream(); |
直接創(chuàng)建stream
stream也提供了api直接生成一個stream,這個stream大概可以理解成一個list。因為內(nèi)部就是數(shù)組實現(xiàn)的。
1
|
stream<integer> integerstream = stream.of( 1 , 2 , 3 ); |
讀取文件的stream
用過linux的就會對其命令行的管道符敬佩不已,一個管道符就可以源源不斷的做處理。在java里讀取文件也可以實現(xiàn)類似的功能。
1
2
3
4
5
6
7
8
|
long uniquewords = 0 ; try (stream<string> lines = files.lines(paths.get( "data.txt" ), charset.defaultcharset())) { uniquewords = lines.flatmap(l -> arrays.stream(l.split( " " ))) .distinct() .count(); } catch (ioexception e) { // } |
通過函數(shù)來生成無限流
stream提供了iterate來生成一個無限序列,一個基于初始值的無限序列。可以用lambda設(shè)置序列的生成規(guī)則,比如每次增加2.
1
2
3
|
stream.iterate( 0 , n -> n + 2 ) .limit( 10 ) .foreach(system.out::println); |
再比如,斐波那契數(shù)列(fibonacci sequence)
1
2
3
4
|
stream.iterate( new int []{ 0 , 1 }, t -> new int []{t[ 1 ], t[ 0 ] + t[ 1 ]}) .limit( 20 ) .map(t -> t[ 0 ]) .foreach(system.out::println); |
stream還提供了另一個generate方法來生成序列。接收一個用戶指定的生成序列函數(shù)intsupplier.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
intsupplier fib = new intsupplier() { private int previous = 0 ; private int current = 1 ; @override public int getasint() { int oldprevious = this .previous; int nextvalue = this .previous + this .current; this .previous = this .current; this .current = nextvalue; return oldprevious; } }; intstream.generate(fib).limit( 10 ).foreach(system.out::println); |
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:http://www.cnblogs.com/woshimrf/p/Java8-build-stream.html