本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

一、概念介绍

在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);
                        Java集合框架Collection接口
                    
Java集合框架是Java编程中的一个非常重要的部分,提供了一组用于处理数据集合的接口和类。其中Collection接口是Java集合框架的基础接口之一,定义了一些基本的集合操作,包括添加元素、删除元素、遍历集合等。在这里,我将为您详细介绍Java集合框架中的Collection接口。 Collection接口是Java集合框架中的基础接口,定义了一些基本的集合操作,包括添加元素、删除元素、遍历集合等。在Java中,Collection接口是一个顶层接口,它有两个主要的子接口:List和Set。其中,List是一个有序的集合,可以包含重复的元素;而Set是一个不重复的集合,元素是无序的。
使用Java面向对象编写网络通信程序应用 Elasticsearch Java API Client 开发 手动部署Java Web环境(Alibaba Cloud Linux 2) 搭建Java Web开发环境(Anolis OS) RocketMQ中使用Java客户端发送消息和消费的应用