Java8 利用新特性进行分组求和、分组计数、分组归约(聚合)

在这里插入图片描述

1.简述:

在 Java8 中,可以使用 Stream API 的 Collectors.groupingBy 方法将流中的元素按照指定的分类函数进行分组,并生成一个 Map<T, List<R> 对象,然后可以使用 Collectors.counting()Collectors.summingInt()Collectors.reducing()Collectors.collectingAndThen() 等方法对分组后的集合进行计数求和规约集合处理等操作。

2.代码实现

import lombok.Data;

import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * <p> @Title MyClass
 * <p> @Description java8 聚合/归约测试
 *
 * @author ACGkaka
 * @date 2023/4/13 19:15
 */
public class MyClass {

    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(
                new Person("Alice", "Female", 25),
                new Person("Bob", "Male", 30),
                new Person("Charlie", "Male", 35),
                new Person("Dave", "Male", 30),
                new Person("Eve", "Female", 25)
        );

        // 按照性别分组,并计算每组的人数
        Map<String, Long> countByGender = persons.stream()
                .collect(Collectors.groupingBy(Person::getGender, Collectors.counting()));
        System.out.println("countByGender = " + countByGender);

        // 按照性别分组,并计算每组的年龄总和(实现方式一)(推荐)
        Map<String, Integer> ageSumByGender1 = persons.stream()
                .collect(Collectors.groupingBy(Person::getGender, Collectors.summingInt(Person::getAge)));
        System.out.println("ageSumByGender1 = " + ageSumByGender1);

        // 按照性别分组,并计算每组的年龄总和(实现方式二:归约)(不推荐)
        Map<String, Integer> ageSumByGender2 = persons.stream()
                .collect(Collectors.groupingBy(Person::getGender, Collectors.reducing(0, Person::getAge, Integer::sum)));
        System.out.println("ageSumByGender2 = " + ageSumByGender2);

        // 按照性别分组,并计算每组的最大年龄(实现方式一:集合处理)(非常不推荐)
        Map<String, Person> ageMaxByGender1 = persons.stream()
                .collect(Collectors.groupingBy(Person::getGender,
                        Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Person::getAge)), Optional::get)));
        System.out.println("ageMaxByGender1 = " + ageMaxByGender1);

        // 按照性别分组,并计算每组的最大年龄(实现方式二:转映射)(推荐)
        Map<String, Person> ageMaxByGender2 = persons.stream()
                .collect(Collectors.toMap(Person::getGender, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(Person::getAge))));
        System.out.println("ageMaxByGender2 = " + ageMaxByGender2);
    }

    @Data
    static class Person {
        private String name;
        private String gender;
        private int age;

        public Person(String name, String gender, int age) {
            this.name = name;
            this.gender = gender;
            this.age = age;
        }
    }
}

3.执行结果

在这里插入图片描述

4.补充:归约和聚合的区别?

  • 归约:是将一个集合中的元素合并成一个结果。通常返回一个单一的值。
  • 聚合:是将一个集合中的元素按照某种规则分组或分类,并对每个组或类别进行汇总计算。通常返回一个包含汇总结果的数据结构(如Map、List等)。

整理完毕,完结撒花~ 🌻





参考地址:

1.java8中 Collectors.groupingBy用法,https://blog.csdn.net/weixin_40482816/article/details/115379695

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值