stream( ).collect ( Collectors.groupingBy ( ) ) 的用法

news2024/11/15 17:48:58

文章目录

    • 第一种解释
      • 1、基本用法
      • 2、指定值收集器
      • 3、多级分组
      • 4、常见应用场景和用处
    • 第二种解释
      • 1、基本语法
      • 2、示例
      • 3、更复杂的用法

第一种解释

Collectors.groupingBy 是 Java 8 引入的 Stream API 中的一个收集器(Collector),它用于将流(Stream)中的元素根据某个分类函数收集到 Map 中。这个 Map 的键是分类函数的返回值,值是流中对应键的所有元素的列表(List)。

Collectors.groupingBy 有几个重载版本,允许你指定如何映射键以及如何收集值。

1、基本用法

import java.util.*;
import java.util.stream.Collectors;

List<String> fruits = Arrays.asList("apple", "banana", "apple", "orange", "banana");

Map<String, List<String>> fruitCountMap = fruits.stream()
    .collect(Collectors.groupingBy(fruit -> fruit));

System.out.println(fruitCountMap);
// 输出: {apple=[apple, apple], banana=[banana, banana], orange=[orange]}

2、指定值收集器

你还可以指定一个下游收集器(downstream collector)来收集每个键对应的值。例如,如果你想计算每个水果的数量而不是收集到一个列表中,你可以这样做:

Map<String, Long> fruitCountMap = fruits.stream()
    .collect(Collectors.groupingBy(fruit -> fruit, Collectors.counting()));

System.out.println(fruitCountMap);
// 输出: {apple=2, banana=2, orange=1}

3、多级分组

你还可以使用 groupingBy 进行多级分组。这通常是通过 Collectors.groupingBy 的嵌套使用来实现的。例如,假设你有一个 Person 类,你想先按性别分组,然后按年龄分组:

List<Person> people = ... // 假设这里有一个 Person 对象的列表

Map<Gender, Map<Integer, List<Person>>> groupedByGenderAndAge = people.stream()
    .collect(Collectors.groupingBy(Person::getGender, 
        Collectors.groupingBy(Person::getAge)));

在这个例子中,groupedByGenderAndAge 是一个 Map,其键是 Gender 枚举类型,值是另一个 Map,该 Map 的键是年龄(Integer),值是符合这两个条件的 Person 对象的列表。

4、常见应用场景和用处

Collectors.groupingBy 在 Java 中是一个非常有用的工具,它允许你以简洁且声明式的方式 对流中的元素进行 分组 。这在处理大量数据并希望以某种方式对它们进行分类时特别有用。以下是 Collectors.groupingBy 的一些常见应用场景和用处:

  1. 数据聚合:当你有一组数据并希望根据某个或多个属性将它们分组以进行进一步分析或处理时,groupingBy 是一个很好的选择。例如,你可能有一个订单列表,并希望按客户或产品类型对它们进行分组。

  2. 统计和报告:在处理大量数据时,经常需要生成各种统计报告。使用 groupingBy 可以很容易地根据某个或多个属性对数据进行分组,并计算每个组的数量、总和、平均值等。

  3. 优化和性能:通过将数据分组,你可以更容易地识别出异常值、模式或趋势,从而优化系统性能或业务决策。

  4. 数据可视化:在数据可视化中,经常需要将数据分组以创建有意义的图表和图形。使用 groupingBy 可以简化将数据准备成可视化工具所需格式的过程。

  5. 多级分组:通过嵌套使用 groupingBy,你可以对数据进行多级分组。这在处理具有多个维度或属性的数据时特别有用,例如地理位置(国家/地区、州/省、城市)或产品分类(部门、类别、子类别)。

  6. 简化代码:与传统的循环和条件语句相比,使用 groupingBy 可以使代码更简洁、更易读。它还允许你以声明式方式表达你的意图,而不是编写冗长的过程式代码。

  7. 扩展性groupingBy 是一个灵活的工具,可以与其他 Stream API 方法和收集器(如 filteringmappingcountingsummingInt 等)一起使用,以创建复杂的数据处理管道。

总之,Collectors.groupingBy 是 Java 8 Stream API 中的一个强大工具,它可以帮助你以简洁、高效和可维护的方式处理大量数据。

第二种解释

在Java中,stream().collect(Collectors.groupingBy()) 是一个常用的函数式编程方法,用于将流中的元素根据指定的分类器函数分组,并收集到一个Map中。这里是一个基本的使用示例和解释:

1、基本语法

Map<K, List<T>> result = stream.collect(Collectors.groupingBy(keyExtractor));
  • stream:是一个流对象,包含了你想要分组的数据。
  • Collectors.groupingBy(keyExtractor):这是关键部分,它接受一个函数(通常是一个 lambda 表达式或者方法引用),这个函数被称为keyExtractor,用于从流中的每个元素提取一个键(K类型),用来决定如何分组。
  • result:是一个Map,其中的键是keyExtractor产生的值,值是列表,列表中包含所有拥有相同键的元素。

2、示例

假设我们有一个Person类,包含属性nameage,并且有一个List<Person>,我们想要按照年龄分组:

class Person {
    String name;
    int age;
    // 构造函数、getter和setter省略...
}

List<Person> people = ... // 初始化人员列表

Map<Integer, List<Person>> peopleByAge = people.stream()
    .collect(Collectors.groupingBy(Person::getAge));

// 打印结果
peopleByAge.forEach((ageGroup, persons) ->
    System.out.println("Age " + ageGroup + ": " + persons));

在这个例子中,Person::getAge是一个方法引用,作为keyExtractor,它将人按年龄分组。结果是一个映射,其中键是年龄,值是具有相同年龄的Person对象列表。

3、更复杂的用法

Collectors.groupingBy还支持更复杂的分组操作,比如分组后进一步收集操作(如求和、平均值、计数等):

Map<Integer, Double> averageAgeByAgeGroup = people.stream()
    .collect(Collectors.groupingBy(Person::getAge, 
        Collectors.averagingInt(Person::getAge)));

在这个变体中,我们不仅按年龄分组,还在每个分组内计算平均年龄。

记住,Collectors.groupingBy非常灵活,可以根据具体需求进行各种定制。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1688294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NumPy】关于numpy.transpose()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

16.js数学方法和进制转换

数学方法 &#xff08;1&#xff09;Math.random() 默认生成0-1的随机数 var resMath.random() console.log(res) &#xff08;2&#xff09;Math.round(数字) 取整&#xff1a;正数-四舍五入 负数-5舍6入 var resMath.round(11)console.log(res) //11var res1Math.round(1…

2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

配置加载原理 在Spring中PropertySource类实现了所有属性的实例化。 启动赋值&#xff1a; 定义自定义属性配置源&#xff0c;从config-server获取全局属性&#xff1b;Spring启动时&#xff0c;插入自定义属性配置源&#xff1b;绑定属性会优先使用&#xff0c;给自定义属性…

下拉框操作/键鼠操作/文件上传

在我们做UI自动化测试的时候&#xff0c;会有一些元素需要特殊操作&#xff0c;比如下拉框操作/键鼠操作/文件上传。 下拉框操作 在我们很多页面里有下拉框的选择&#xff0c;这种元素怎么定位呢&#xff1f;下拉框分为两种类型&#xff1a;我们分别针对这两种元素进行定位和…

移动硬盘容量消失无法读取的解决方案

在数字化时代&#xff0c;数据的存储和备份变得尤为重要。移动硬盘作为一种便捷、大容量的存储设备&#xff0c;受到许多人的青睐。然而&#xff0c;有时我们可能会遭遇这样的问题&#xff1a;移动硬盘不显示容量且无法访问。这种情况无疑给我们的数据存储和管理带来了巨大的困…

sequence cache太小导致enq: SQ – contention

当业务卡的时候&#xff0c;发现大量等待事件为enq: SQ – contention&#xff0c;检查awr的top 5事件&#xff1a; sql语句对sequence的调用非常频繁&#xff1a; 对这些语句排查发现sequence cache值均为默认20&#xff0c;调大cache到1000值&#xff1a; SQL> select SE…

基于YOLOV8/YOLOV5的PCB板缺陷检测识别系统

摘要&#xff1a; 本文详细阐述了一个利用深度学习进行PCB板缺陷检测的系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能比较。该系统能够在图像、视频、实时视频流和批量文件中精确地识别和分类PCB板缺陷。文中不仅深…

WiFi蓝牙模块厂家带你了解蓝牙模块功率的等级

目前蓝牙技术的突破已经让许多蓝牙模块厂家从业者忘记了很多专业术语&#xff0c;比如Class1&#xff0c;Class2等&#xff0c;那么我们就蓝牙模块发射功率来做个详细了解。   针对功率来说&#xff0c;低功耗蓝牙和经典蓝牙又有区别。   低功耗蓝牙没有功率的级别&#xf…

Milvus:揭秘未来数据探索之钥

Milvus是什么&#xff1f; 想象一下&#xff0c;你正坐在一个巨大的图书馆中&#xff0c;成千上万本书摆放在眼前&#xff0c;但图书馆却没有目录和顺序&#xff0c;这听起来像一项艰巨的任务&#xff0c;不是吗&#xff1f;好消息是&#xff0c;在数字世界中&#xff0c;我们…

经纬恒润第三代重载自动驾驶平板车

随着无人驾驶在封闭场地和干线道路场景的加速落地&#xff0c;港口作为无人化运营的先行者&#xff0c;其场景的复杂度、特殊性对无人化运营的技术提出了各种挑战。经纬恒润作为无人驾驶解决方案提供商&#xff0c;见证了港口在无人化运营方面的尝试及发展&#xff0c;并深度参…

Python——基于共享单车使用量数据的可视化分析(1)

目录 &#x1f9fe; 1、数据集&#xff08;部分数据&#xff09; ✏️ 2、导入数据集与必要模块 1️⃣ 2.1 导入库以及字体包 2️⃣ 2.2 读取数据集 3️⃣ 2.3 查看数据集基本信息 ⌨️ 3、数据预处理 1️⃣ 3.1删除无关字段 2️⃣ 3.2对各字段进行中文标识 3️⃣ 3.3…

Timeline

SignalTrack信号轨道和自定义带参数的Marker信号和轨道 MySignalReceiver using System; using System.ComponentModel; using UnityEngine.Playables; using UnityEngine.Events;namespace UnityEngine.Timeline { public class BaseSignalReceiver<T, Q> : MonoBeha…

3100点失守,小丑竟是我自己

敏感时刻&#xff0c;亮剑的我们股市买单&#xff0c;海的那边反倒还涨了&#xff0c;好生气啊&#xff01;就连我们胡主编昨晚都气得睡不着&#xff0c;一点多了还在那抒发情感&#xff0c; 确实&#xff0c;有句话说到心窝里了&#xff1a;小散们是拿真金白银撑场子的&#x…

微星打造全球首款DDR5 CAMM2内存主板:这下清爽了

微星预告了新款主板“ Z790 Project Zero Plus”&#xff0c;这也是 全球第一款配备DDR5 CAMM2内存的桌面主板&#xff01; CAMM全称为“Compression Attached Memory Module”&#xff0c;已被JEDEC组织接纳为行业标准&#xff0c;相比传统的SO-DIMM、DIMM内存最大特点就是取消…

大模型之Ollama:在本地机器上释放大型语言模型的强大功能

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

spark的简单学习一

一 RDD 1.1 RDD的概述 1.RDD&#xff08;Resilient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;是Apache Spark中的一个核心概念。它是Spark中用于表示不可变、可分区、里面的元素可并行计算的集合。RDD提供了一种高度受限的共享内存模型&#xff0c;即RD…

翻译《The Old New Thing》- Why do we even have the DefWindowProc function?

Why do we even have the DefWindowProc function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071105-00/?p24583 Raymond Chen 2007年11月05日 为什么一定要使用 DefWindowProc 函数&#xff1f; 简要 文章讨论了为什么我们有DefW…

day15|各种遍历的应用

相关题目&#xff1a; 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路&#xff1a;层次遍历二叉树&#xff0c;将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 什么是弹性布局&#xff08;Flex&#xff09;&#xff1f; 弹性布局&#xff08;Flex&#xff09;是一种基于弹性盒子模型的布局方式&#xff0c;类…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…