是對集合對象功能的增強,它專注於對集合對象非常便利、高效的聚合操作,或者大批量數據操作,藉助於lambda 表達式,提高
編程效率和可讀性。同時提供串行和並行倆種模式進行操作。
在當前大數據爆炸的年代,在數據來源多樣化、數據海量化的今天不得不脫離RDBMS,或者以底層返回的數據結構爲基礎進行上層的數據統計。
而java 的集合API中,僅僅有極少的輔助方法,更多時候需要程序員用Iterator來遍歷集合,完成相應的聚合邏輯。這是一種不高效的方法
在java 7 中如果要發現 type 爲grocery的所有交易,然後返回降序排列的ID需要這樣寫
List<Transaction> gTs = new ArrayList<>();
for(Transaction t:transactions){
if(t.type == grocery){
gTs.add(t);
}
}
Collections.sort(gts,new Comparator<Transaction>(){
@Override
public int compare(Transaction o1,Transaction o2){
return o1.getValue() - o2.getValue();
}
})
List<Integer> l = new ArrayList<>();
for(Transaction t:gTs){
l.add(t.getId());
}
而是用java8 Stream
transactions.stream().filter(a->a.type == grocery).map(a->a.getId()).sorted().collect(Collectors.toList());
- 關於lambda表達式
//接口中只有一個抽象方法
//object方法除外
//默認方法除外
new Thread(()->System.out.println("xxxx"));
new Thread(new Runnable(){
@Override
public void run (){
System.out.println("xxxx");
}
});
現在我們再看 Stream ,其實我們上面的寫法, xxx.stream().filter().map().sorted().collect(); 像是一個管道pipeline一樣
將數據源的數據流 過濾排序採集 最後生成結果數據。
注意:在管道中的流的數據永遠不會改變 同時不會在內存中存儲、也不能夠重複使用。我們還要注意 管道中的元素是一個個被處理的 而不是一批批處理。
- 常見用法
//flatMap flatMap 將 List<Integer>扁平化 轉化爲 Stream<Integer>
Stream<List<Integer>> sl = Stream.of(Arrays.asList(1,2),Arrays.asList(3,4));
Stream<Integer> si = sl.flatMap(childList->childList.stream());
//過濾整型數組
Integer[] sixNums = {1, 2, 3, 4, 5, 6};
Integer[] res = Stream.of(sixNums).filter(a->a%2 == 0).toArray(Integer[]::new);
//過濾文件 中的line
File file = new File("C:\\Users\\InAHurry\\Desktop\\a.txt");
BufferedReader bf = new BufferedReader(new FileReader(file));
List<String> s = bf.lines().flatMap(line->Stream.of(line.split(" "))).filter(word->word.length()>0).
collect(Collectors.toList());
//利用peek 查看元素
List<String> ls=Stream.of("you","are")
.peek(a->System.out.println(a)).map(s->s.toUpperCase())
.peek(a->System.out.println(a)).collect(Collectors.toList());
//利用reduce 組合元素(求最大值 最小值 求和 求平均)
Integer[] sixNums = {1, 2, 3, 4, 5, 6};
int sum = Stream.of(sixNums).reduce(0,(a,b)->a+b);
int min = Stream.of(sixNums).reduce(Integer.MAX_VALUE,Integer::min);