Java Stream GroupBy

一、GroupBy的概念与组成

在 Java 中,Stream GroupBy 是一个用于将数据分组的功能。按照指定的元素进行分组,然后将操作应用到已分组的数据上。它由三个组成部分组成:分组的键、分组的值、以及将被应用到每个组的方程。

Stream GroupBy 提供了一个非常简单且灵活的方法来对复杂的数据集进行分组操作。通过这种方式,我们可以进行聚合、计数、筛选等各种操作。


List<Person> list = Arrays.asList(
new Person("John", "Boston", 21),
new Person("Sara", "Boston", 25),
new Person("Mark", "New York", 50),
new Person("Tim", "Boston", 32),
new Person("Tony", "New York", 45));

Map<String,List<Person>> cityToPersonListMap =
list.stream().collect(Collectors.groupingBy(Person::getCity));

在这个例子中,我们使用了Stream groupBy 来根据人所在的城市将人员分组。它返回一个由城市名称分组的人员列表。

二、GroupBy的优点和用途

Java Stream GroupBy 的功能非常强大,可以用于各种不同的用途。下面是一些常见的用例:

1、计数


Map<String, Long> countByCity = list.stream()
.collect(Collectors.groupingBy(Person::getCity, Collectors.counting()));

这个例子将按城市名称计算人数,并返回一个包含每个城市人数的 Map。

2、平均值


Map<String, Double> avgByCity = list.stream()
.collect(Collectors.groupingBy(Person::getCity, Collectors.averagingInt(Person::getAge)));

这段代码将计算在每个城市中每个人的平均年龄,并返回一个包含每个城市平均年龄的 Map。

3、分组键值连接和获取


Map<String, String> nameByCity = list.stream()
.collect(Collectors.groupingBy(Person::getCity,
Collectors.mapping(Person::getName, Collectors.joining(", "))));

这个例子将在每个城市中获取人名列表,并将他们按逗号分隔开来。

三、GroupBy的注意点与拓展

在使用 Java Stream GroupBy 时,有几个需要注意的点:

1、结果类型与返回值

在使用 Java Stream GroupBy 时,返回类型与方法的返回值有关。例如,我们可以通过调用Collectors.counting()方法来计数。


Map<String, Long> countByCity = list.stream()
.collect(Collectors.groupingBy(Person::getCity, Collectors.counting()));

同样的道理适用于其他的聚合操作。例如,我们可以使用 Collectors.summingInt 方法来将整数求和。

2、分组前进行筛选


Map<String, List<Person>> cityToPersonListMap = list.stream()
.filter(person -> person.getAge() >= 21)
.collect(Collectors.groupingBy(Person::getCity));

在这个例子中,我们使用 Stream 进行了一个筛选操作来筛选年龄大于等于 21 的人体。同样的道理适用于其他类型的筛选操作,例如,筛选出某个特定城市的人员。

3、多级分组


Map<String,Map<String,List<Person>>> stateToCityToPersonListMap =
list.stream().collect(Collectors.groupingBy(Person::getState,
groupingBy(Person::getCity)));

在这个例子中,我们使用 Stream GroupBy 进行了一个两级分组。首先按照国家名称分组,然后在每个国家的基础上按照城市名称分组。

4、修改分组键


Map<String, List<Person>> ageToPersons =
list.stream().collect(Collectors.groupingBy(person -> {
if (person.getAge() <= 25) {
return "young";
} else {
return "old";
}
}));

在这个例子中,我们从年龄键中获取了自定义键,从而创建了一个规则来将所有人分为两组:年轻和年老。

5、并行处理


Map<String, List<Person>> cityToPersonListMapParallel =
list.parallelStream().collect(Collectors.groupingBy(Person::getCity));

我们可以使用 java Stream 的 parallelStream() 方法来让代码并行运行。在这个方法中,分组操作可以并行运行,从而提高整个过程的速度。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/257111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-15 12:43
下一篇 2024-12-15 12:43

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论