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

目录
相关文章
|
4天前
|
监控 算法 Java
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,特别是垃圾回收(Garbage Collection, GC)机制。我们将从基础概念开始,逐步解析垃圾回收的工作原理、不同类型的垃圾回收器以及它们在实际项目中的应用。通过实际案例,读者将能更好地理解Java应用的性能调优技巧及最佳实践。
21 0
|
25天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
60 0
|
3天前
|
存储 Java API
Java——Stream流详解
Stream流是JDK 8引入的概念,用于高效处理集合或数组数据。其API支持声明式编程,操作分为中间操作和终端操作。中间操作包括过滤、映射、排序等,可链式调用;终端操作则完成数据处理,如遍历、收集等。Stream流简化了集合与数组的操作,提升了代码的简洁性
29 11
Java——Stream流详解
|
12天前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer&lt;T&gt;`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer&lt;T&gt;`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
Java 8 Stream Api 中的 peek 操作
|
12天前
|
Java C# Swift
Java Stream中peek和map不为人知的秘密
本文通过一个Java Stream中的示例,探讨了`peek`方法在流式处理中的应用及其潜在问题。首先介绍了`peek`的基本定义与使用,并通过代码展示了其如何在流中对每个元素进行操作而不返回结果。接着讨论了`peek`作为中间操作的懒执行特性,强调了如果没有终端操作则不会执行的问题。文章指出,在某些情况下使用`peek`可能比`map`更简洁,但也需注意其懒执行带来的影响。
Java Stream中peek和map不为人知的秘密
|
3天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
24天前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
22天前
|
Java
盘点java8 stream中隐藏的函数式接口
`shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住感动瞬间。本文介绍了函数式接口的概念及其在Java中的应用,包括`Comparator`、`Runnable`、`Callable`等常见接口,并详细讲解了`Function`、`Predicate`、`Consumer`、`Supplier`和`Comparator`等函数式接口的使用方法及应用场景,展示了如何利用这些接口简化代码并提高编程效率。**个人IP:shigen**,与shigen一起,每天进步一点点!
30 0
盘点java8 stream中隐藏的函数式接口
|
27天前
|
Java API 网络安全
探索Java中的Stream API:从基础到高级应用云计算与网络安全:技术融合与挑战
【8月更文挑战第27天】在Java的海洋中,Stream API犹如一艘强大的船,让开发者能以声明式的方式处理集合数据。本文将启航,先带你了解Stream的基本概念和用法,再深入探讨其高级特性,如并行流、管道操作以及性能考量。我们将通过具体代码示例,展示如何高效利用Stream API简化数据处理流程,提升代码的可读性和性能。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往更优雅编程风格的大门。