zoukankan      html  css  js  c++  java
  • Java8 如何进行stream reduce,collection操作

    Java8 如何进行stream reduce,collection操作

    2014-07-16 16:42 佚名 oschina 字号:T | T
    一键收藏,随时查看,分享好友!

    在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作

    AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验

    在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作。 JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个collection集合实例。很多的reduce操作执行特定的任务,如求平均值或按类别分 组元素。

    JDK提供的通用的聚合操作:Stream.reduce,Stream.collection

      注意:本文将reduction operations翻译为聚合操作,因为reduction operations通常用于汇聚统计。

     两者的区别:

     Stream.reduce,常用的方法有averagesumminmax, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值

     Stream.collection与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值

    1. package lambda; 
    2.   
    3. import java.util.Arrays; 
    4. import java.util.List; 
    5. import java.util.Map; 
    6. import java.util.stream.Collectors; 
    7.   
    8. public class LambdaMapReduce { 
    9.     private static List<User> users = Arrays.asList( 
    10.             new User(1, "张三", 12,User.Sex.MALE), 
    11.             new User(2, "李四", 21, User.Sex.FEMALE), 
    12.             new User(3,"王五", 32, User.Sex.MALE), 
    13.             new User(4, "赵六", 32, User.Sex.FEMALE)); 
    14.   
    15.     public static void main(String[] args) { 
    16.         reduceAvg(); 
    17.         reduceSum(); 
    18.   
    19.           
    20.         //与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值 
    21.         //获取所有男性用户的平均年龄 
    22.         Averager averageCollect = users.parallelStream() 
    23.                 .filter(p -> p.getGender() == User.Sex.MALE) 
    24.                 .map(User::getAge) 
    25.                 .collect(Averager::new, Averager::accept, Averager::combine); 
    26.   
    27.         System.out.println("Average age of male members: " 
    28.                 + averageCollect.average()); 
    29.   
    30.         //获取年龄大于12的用户列表 
    31.         List<User> list = users.parallelStream().filter(p -> p.age > 12) 
    32.                 .collect(Collectors.toList()); 
    33.         System.out.println(list); 
    34.   
    35.         //按性别统计用户数 
    36.         Map<User.Sex, Integer> map = users.parallelStream().collect( 
    37.                 Collectors.groupingBy(User::getGender, 
    38.                         Collectors.summingInt(p -> 1))); 
    39.         System.out.println(map); 
    40.   
    41.         //按性别获取用户名称 
    42.         Map<User.Sex, List<String>> map2 = users.stream() 
    43.                 .collect( 
    44.                         Collectors.groupingBy( 
    45.                                 User::getGender, 
    46.                                 Collectors.mapping(User::getName, 
    47.                                         Collectors.toList()))); 
    48.         System.out.println(map2); 
    49.           
    50.         //按性别求年龄的总和 
    51.         Map<User.Sex, Integer> map3 = users.stream().collect( 
    52.                 Collectors.groupingBy(User::getGender, 
    53.                         Collectors.reducing(0, User::getAge, Integer::sum))); 
    54.   
    55.         System.out.println(map3); 
    56.           
    57.         //按性别求年龄的平均值 
    58.         Map<User.Sex, Double> map4 = users.stream().collect( 
    59.                 Collectors.groupingBy(User::getGender, 
    60.                         Collectors.averagingInt(User::getAge))); 
    61.         System.out.println(map4); 
    62.   
    63.     } 
    64.   
    65.     // 注意,reduce操作每处理一个元素总是创建一个新值, 
    66.     // Stream.reduce适用于返回单个结果值的情况 
    67.     //获取所有用户的平均年龄 
    68.     private static void reduceAvg() { 
    69.         // mapToInt的pipeline后面可以是average,max,min,count,sum 
    70.         double avg = users.parallelStream().mapToInt(User::getAge) 
    71.                 .average().getAsDouble(); 
    72.   
    73.         System.out.println("reduceAvg User Age: " + avg); 
    74.     } 
    75.   
    76.     //获取所有用户的年龄总和 
    77.     private static void reduceSum() { 
    78.         double sum = users.parallelStream().mapToInt(User::getAge) 
    79.                 .reduce(0, (x, y) -> x + y); // 可以简写为.sum() 
    80.   
    81.         System.out.println("reduceSum User Age: " + sum); 
    82.     } 
       

    三、参考

    http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html

    本文链接:http://my.oschina.net/cloudcoder/blog/215169

  • 相关阅读:
    青蛙学Linux—Nginx配置文件详解
    ICEM二维网格
    ubuntu画面延迟问题解决
    plot over time
    fluent中UDF环境变量问题的三种解决方法
    stiff chemistry模型出现NaN错误
    壁面边界漏给条件引起的发散问题
    mfix添加文件后重新生成configure文件
    DEM反应不收敛问题
    多气体组分DEM流动的DMP并行内存错误
  • 原文地址:https://www.cnblogs.com/lupeng2010/p/6148823.html
Copyright © 2011-2022 走看看