当前位置: 首页 > 科技观察

Java8是如何进行stream、reduce、collection操作的

时间:2023-03-12 13:02:57 科技观察

一、概念介绍在java8中JDK包含了很多聚合操作(比如average、sum、minimum、***、count),并返回一个计算的聚合结果流流。这些聚合操作称为聚合操作。JDK中除了返回单个值的聚合操作外,还有很多返回集合实例的聚合操作。许多reduce操作执行特定任务,例如按类别对元素进行平均或分组。JDK提供的通用聚合操作:Stream.reduce、Stream.collection注意:本文将归约操作翻译为聚合操作,因为归约操作通常用于聚合统计。两者的区别:Stream.reduce,常用的方法有average、sum、min、max和count,返回单个结果值,而reduce操作总是为每个处理过的元素创建一个新值Stream.collection和stream。reduce方法不同,Stream.collect修改现有值,而不是为每个处理的元素创建一个新值。stream.Collectors;publicclassLambdaMapReduce{privatestaticListusers=Arrays.asList(newUser(1,"张三",12,User.Sex.MALE),newUser(2,"李四",21,User.Sex.FEMALE),newUser(3,"王舞",32,User.Sex.MALE),newUser(4,"赵六",32,User.Sex.FEMALE));publicstaticvoidmain(String[]args){reduceAvg();reduceSum();//与stream.reduce方法不同,Stream.collect修改已有的值,而不是为每个处理的元素创建一个新值//获取平均年龄所有男性用户的AverageaverageCollect=users.parallelStream()。filter(p->p.getGender()==User.Sex.MALE).map(User::getAge).collect(Averager::new,Averager::accept,Averager::combine);System.out.println("Averageofmalemembers:"+averageCollect.average());//获取年龄大于12的用户列表Listlist=users.parallelStream().filter(p->p.age>12).collect(Collectors.toList());System.out.println(list);//Map按性别统计用户的map=users.parallelStream().collect(Collectors.groupingBy(User::getGender,Collectors.summingInt(p->1)));System.out.println(map);//按性别获取用户名Map>map2=users.stream().collect(Collectors.groupingBy(User::getGender,Collectors.mapping(User::getName,Collectors.toList())));System.out.println(map2);//性别年龄总和Mapmap3=users.stream().collect(Collectors.groupingBy(User::getGender,Collectors.reducing(0,User::getAge,Integer::sum)));System.out.println(map3);//性别平均年龄Mapmap4=users.stream().collect(Collectors.groupingBy(User::getGender,Collectors.averagingInt(User::getAge)));System.out.println(map4);}//注意reduce操作总是为每个处理的元素创建一个新值,//Stream.reduce适用于返回单个的situationoftheresultvalue//获取所有用户的平均年龄privatestaticvoidreduceAvg(){//mapToInt的pipeline后面可以接average,max,min,count,sumdoubleavg=users.parallelStream().mapToInt(User::getAge).average().getAsDouble();System.out.println("reduceAvgUserAge:"+avg);}//获取所有用户的年龄总和privatestaticvoidreduceSum(){doublesum=users.parallelStream().mapToInt(User::getAge).reduce(0,(x,y)->x+y);//可以简写为.sum()System.out.println("reduceSumUserAge:"+sum);}}3.参考http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html原文链接:https://img.ydisp.cn/news/20220914/zmgmrihscn2