JDK1.8聚合操作


在java8 JDK包含許多聚合操作(如平均值,總和,最小,最大,和計數),返回一個計算流stream的聚合結果。這些聚合操作被稱為聚合操作。JDK除返回單個值的聚合操作外,還有很多聚合操作返回一個collection集合實例。很多的reduce操作執行特定的任務,如求平均值或按類別分組元素。
JDK提供的通用的聚合操作:Stream.reduce,Stream.collection
注意:本文將reduction operations翻譯為聚合操作,因為reduction operations通常用於匯聚統計。
兩者的區別:
Stream.reduce,常用的方法有average, sum, min, max, and count,返回單個的結果值,並且reduce操作每處理一個元素總是創建一個新值
Stream.collection與stream.reduce方法不同,Stream.collect修改現存的值,而不是每處理一個元素,創建一個新值

package lambda; 
 
import java.util.Arrays; 
import java.util.List; 
import java.util.Map; 
import java.util.stream.Collectors; 
 
public class LambdaMapReduce { 
    private static List<User> users = Arrays.asList( 
            new User(1, "張三", 12,User.Sex.MALE),  
            new User(2, "李四", 21, User.Sex.FEMALE),  
            new User(3,"王五", 32, User.Sex.MALE),  
            new User(4, "趙六", 32, User.Sex.FEMALE)); 
 
    public static void main(String[] args) { 
        reduceAvg(); 
        reduceSum(); 
 
         
        //與stream.reduce方法不同,Stream.collect修改現存的值,而不是每處理一個元素,創建一個新值 
        //獲取所有男性用戶的平均年齡 
        Averager averageCollect = users.parallelStream() 
                .filter(p -> p.getGender() == User.Sex.MALE) 
                .map(User::getAge) 
                .collect(Averager::new, Averager::accept, Averager::combine); 
 
        System.out.println("Average age of male members: " 
                + averageCollect.average()); 
 
        //獲取年齡大於12的用戶列表 
        List<User> list = users.parallelStream().filter(p -> p.age > 12) 
                .collect(Collectors.toList()); 
        System.out.println(list); 
 
        //按性別統計用戶數 
        Map<User.Sex, Integer> map = users.parallelStream().collect( 
                Collectors.groupingBy(User::getGender, 
                        Collectors.summingInt(p -> 1))); 
        System.out.println(map); 
 
        //按性別獲取用戶名稱 
        Map<User.Sex, List<String>> map2 = users.stream() 
                .collect( 
                        Collectors.groupingBy( 
                                User::getGender, 
                                Collectors.mapping(User::getName, 
                                        Collectors.toList()))); 
        System.out.println(map2); 
         
        //按性別求年齡的總和 
        Map<User.Sex, Integer> map3 = users.stream().collect( 
                Collectors.groupingBy(User::getGender, 
                        Collectors.reducing(0, User::getAge, Integer::sum))); 
 
        System.out.println(map3); 
         
        //按性別求年齡的平均值 
        Map<User.Sex, Double> map4 = users.stream().collect( 
                Collectors.groupingBy(User::getGender, 
                        Collectors.averagingInt(User::getAge))); 
        System.out.println(map4); 
 
    } 
 
    // 注意,reduce操作每處理一個元素總是創建一個新值, 
    // Stream.reduce適用於返回單個結果值的情況 
    //獲取所有用戶的平均年齡 
    private static void reduceAvg() { 
        // mapToInt的pipeline后面可以是average,max,min,count,sum 
        double avg = users.parallelStream().mapToInt(User::getAge)  
                .average().getAsDouble(); 
 
        System.out.println("reduceAvg User Age: " + avg); 
    } 
 
    //獲取所有用戶的年齡總和 
    private static void reduceSum() { 
        double sum = users.parallelStream().mapToInt(User::getAge) 
                .reduce(0, (x, y) -> x + y); // 可以簡寫為.sum() 
 
        System.out.println("reduceSum User Age: " + sum); 
    } 
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM