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);
	}
}
时间: 2025-01-23 20:17:20

java8 如何进行stream reduce,collection操作的相关文章

java8 lambda表达式与集合类批处理操作

一.基本概念     λ表达式可以被当做是一个Object.λ表达式的类型,叫做"目标类型(target type)".λ表达式的目标类型是"函数接口(functional interface)",这是Java8新引入的概念.它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口.一般用@FunctionalInterface标注出来(也可以不标). @FunctionalInterface public interface Runnable

asp对象化之:基于adodb.stream的文件操作类

ado|stream|对象 <%  '************************************************************* '转发时请保留此声明信息,这段声明不并会影响你的速度! '*************************************************************  '************************************************************* '@author:     

asp之基于adodb.stream的文件操作类_应用技巧

复制代码 代码如下: <% '************************************************************* '转发时请保留此声明信息,这段声明不并会影响你的速度! '************************************************************* '************************************************************* '@author:          

asp之基于adodb.stream的文件操作类

复制代码 代码如下: <% '************************************************************* '转发时请保留此声明信息,这段声明不并会影响你的速度! '************************************************************* '************************************************************* '@author:          

Java8中聚合操作collect、reduce方法详解

Stream的基本概念 Stream和集合的区别: Stream不会自己存储元素.元素储存在底层集合或者根据需要产生.Stream操作符不会改变源对象.相反,它会返回一个持有结果的新的Stream.3.Stream操作可能是延迟执行的,这意味着它们会等到需要结果的时候才执行.Stream操作的基本过程,可以归结为3个部分: 创建一个Stream.在一个或者多个操作中,将指定的Stream转换为另一个Stream的中间操作.通过终止(terminal)方法来产生一个结果.该操作会强制它之前的延时操

Java8初体验(二)Stream语法详解

感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验(一)lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elem

Java8初体验(二)Stream语法详解---符合人的思维模式,数据源--》stream--&gt;干什么事(具体怎么做,就交给Stream)--》聚合

感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一)lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of eleme

使用stream操作表达更高级的数据处理请求, Part 1

使用stream操作表达更高级的数据处理请求,Part 1 原文链接 作者:Raoul-Gabriel Urma 译者:石头狮子(v1.lion@qq.com) 校对:吴京润 没有了集合你会怎么做?几乎每一个Java应用都建立和处理集合.对于许多编程任务而言,这是基础的技术:集合分组和处理数据.例如,你可能想要建立一个银行交易集合来代表用户的账户记录.然后,你想要处理所有的集合找出用户花费了多少金额.尽管集合如此重要,但是Java的实现远非完美. 首先,典型的集合处理模式有点像SQL操作,例如"

Java8 Stream API介绍

Stream API是Java8中处理集合的关键组件,提供了各种丰富的函数式操作. Stream的创建 任何集合都可以转换为Stream: //数组 String[] strArr = new String[]{"aa","bb","cc"}; Stream<String> streamArr = Stream.of(strArr); Stream<String> streamArr2 = Arrays.stream(st