java流式操作

是對集合對象功能的增強,它專注於對集合對象非常便利、高效的聚合操作,或者大批量數據操作,藉助於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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章