java8 如何进行stream reduce,collection操作

简介:

一、概念介绍

    在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修改现存的值,而不是每处理一个元素,创建一个新值

二、源代码

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);
	}
}

目录
相关文章
|
8月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
8月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
373 100
|
8月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
372 101
|
8月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
425 101
|
9月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
450 188
|
9月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
353 92
|
10月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
475 80
|
7月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
293 1
|
8月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
161 0
Java Stream API 的强大功能
|
9月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。