Java8如何进行streamreduce,collection操作

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

10年积累的网站建设、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先制作网站后付款的网站建设流程,更有南靖免费网站建设让你可以放心的选择与我们合作。

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

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

   两者的区别:

   Stream.reduce,常用的方法有average, sum, min, max, 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 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 list = users.parallelStream().filter(p -> p.age > 12)
  32.                 .collect(Collectors.toList());
  33.         System.out.println(list);
  34.  
  35.         //按性别统计用户数
  36.         Map map = users.parallelStream().collect(
  37.                 Collectors.groupingBy(User::getGender,
  38.                         Collectors.summingInt(p -> 1)));
  39.         System.out.println(map);
  40.  
  41.         //按性别获取用户名称
  42.         Map> 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 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 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.     }
  83. }
   

三、参考

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

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

本文名称:Java8如何进行streamreduce,collection操作
文章来源:http://www.shufengxianlan.com/qtweb/news37/232937.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联