1. 程式人生 > >Java 8 集合之流式(Streams)操作, Streams API 詳解

Java 8 集合之流式(Streams)操作, Streams API 詳解

因為當時公司的業務需要對集合進行各種各樣的業務邏輯操作,為了提高效能,就用到了這個東西,因為以往我們以前用集合都是需要去遍歷(序列),所以效率和效能都不是特別的好,而Streams就可以使用並行的方式來操作集合。

Stream 就如同一個迭代器(Iterator),單向,不可往復,資料只能遍歷一次,遍歷過一次後即用盡了,就好比流水從面前流過,一去不復返。

而和迭代器又不同的是,Stream 可以並行化操作,迭代器只能命令式地、序列化操作。顧名思義,當使用序列方式去遍歷時,每個 item 讀完後再讀下一個 item。而使用並行去遍歷時,資料會被分成多個段,其中每一個都在不同的執行緒中處理,然後將結果一起輸出。

Java 的並行 API 演變歷程基本如下:

  1. 1.0-1.4 中的 java.lang.Thread
  2. 5.0 中的 java.util.concurrent
  3. 6.0 中的 Phasers 等
  4. 7.0 中的 Fork/Join 框架
  5. 8.0 中的 Lambda 

1.首先我們來看一個例子:

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
如果我們要篩選出大於1的資料,按照以往的做法是,去遍歷集合,篩選出大於1的,然後用一個新的list去add,例如下面:
List<Integer> templist = new ArrayList<>();
for (Integer integer : list) {
if (integer > 1){
templist.add(integer);
}
}
但是如果用到了Streams操作的話,我們可以換一種寫法,比如下面這樣寫:

list.stream().filter(l -> l>1).collect(Collectors.toList()); 這個意思就是用filter篩選出大於1的資料,並且返回一個list,注意標紅的表示式,這個表示式需要返回布林值,所以可以有很多玩法,自己可以探究噢,


2.還有一種常用的例子

 比如我想改變list種的某一個數據,然後list的其他的都不變,

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);

list.stream().map(l ->{
if (l .equals(1)){
return l;
}
return l;
}).collect(Collectors.toList());
這個的Streams種的map就是可以在裡面寫一些其中的業務邏輯,然後再return,List中包含的資料,當然還有很多種玩法,比如:
List<String> output = wordList.stream(). map(String::toUpperCase). collect(Collectors.toList()); 這是平常用的比較多的2種對集合操作的StreamsAPI,如果大家對這個很感興趣,還想了解更多的玩法的話可以訪問: https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/