Java8 stream流介紹

歡迎進入我的博客:blog.scarlettbai.com查看更多文章

stream作爲Java8的一個重要的新特性,其提供了對於集合的流處理模式,引出了管道的概念,即通過獲取stream流,之後可根據需要進行map、reduce處理,形象的比喻就是將集合想做一條流水,map、reduce則是管道,對流水進行了處理彙總統計等操作。

首先我們來看如下代碼:

private static void getStream(){
    List<String> list = new ArrayList<String>(Arrays.asList("讀書","健身","編程"));
    System.out.println(list.stream());
    list.stream().forEach(s -> System.out.println(s));
}

執行結果如下:

java.util.stream.ReferencePipeline$Head@135fbaa4
讀書
健身
編程

list.stream()方法中會new一個ReferencePipeline類,其中包含了filter、map、reduce等方法,大家可以點進去看下源碼,看源碼是個好習慣。

下面來看一些實際運用的例子:

一:filter過濾

還記得昨天寫的過濾集合中的字符串長度大於4且以A結尾的例子吧,其實藉助stream的filter可以更簡單:

private static void testStatic(){
    List<String> list = new ArrayList<>(Arrays.asList("aaaaA","aA","aaaaa"));
    list.stream().filter(str -> str.length() > 4 && str.endsWith("A"))
            .forEach(System.out::printf);
}

輸出結果:

aaaaA

filter顧名思義,就是對於stream流進行一個過濾操作,入參是一個lambda表達式,返回的還是一個stream,也就是說後面還可以跟一個filter或者別的流操作,不過此處需要注意的是filter返回的是一個新的集合,不是直接在以前的集合上做的remove。上面代碼寫成這樣也是一樣的:

private static void testStatic(){
    List<String> list = new ArrayList<>(Arrays.asList("aaaaA","aA","aaaaa"));
    list.stream().filter(str -> str.endsWith("A"))
            .filter(str -> str.length() > 4).forEach(System.out::printf);
}

二:map修改集合中元素

stream流可以對於其中的元素通過map做處理,如將其中所有元素乘2:

private static void testMap(){
    List<Double> list = new ArrayList<>(Arrays.asList(5d,6d,3d,7d));
    list.stream().map(d -> d*2).forEach(System.out::println);
}

輸出結果:

10.0
12.0
6.0
14.0

三:reduce處理

reduce可以對stream流進行聚合處理,比如我們要將上個例子中的所有元素想加:

private static void testReduce(){
    List<Double> list = new ArrayList<>(Arrays.asList(5d,6d,3d,7d));
    System.out.println(list.stream().map(d -> d*2)
            .reduce(0d,(result , d) -> result +=d));
}

輸出結果:

42.0

可以看到,結果是將map中輸出的元素做了想加操作,這裏reduce分別有1、2、3個參數的方法,大家可以點親自試一下各自的用法,當然和mongodb等不一樣的地方在於,這裏的reduce不是必須要放在map後的,也可以不要map直接使用的。

四:distinct去重處理

distinct可以對集合進行去重處理,如:

private static void testDistinct(){
    List<Integer> list = new ArrayList<>(Arrays.asList(5,6,3,7,3,1,5));
    list.stream().distinct().forEach(System.out::println);
}

輸出結果:

5
6
3
7
1

五:summaryStatistics做統計處理

stream通過mapToInt轉換成IntStream後可以通過summaryStatistics方法來獲取當前集合的狀態量,比如最小值,最大值,平均值等,代碼如下:

private static void testSummary(){
    List<Long> list = new ArrayList<>(Arrays.asList(5l,6l,3l,7l,1l));
    IntSummaryStatistics status = list.stream().mapToInt(x -> x.intValue()).summaryStatistics();
    System.out.println("minVaule=" + status.getMin());
    System.out.println("maxVaule=" + status.getMax());
    System.out.println("avgVaule=" + status.getAverage());
    System.out.println("sum=" + status.getSum());
}

輸出結果:

minVaule=1
maxVaule=7
avgVaule=4.4
sum=22

可以看到,通過這種方法可以很方便的對於集合做統計操作,當然這裏不止有IntStream,還有DoubleStream和LongStream,原理是一樣的,大家可以自己試試。

今天就先介紹到這裏,大家有什麼問題歡迎關注公衆號後發消息提出。


歡迎關注個人微信公衆號:讀書健身編程

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章