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

文章目录

    • 第一种解释
      • 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非常灵活,可以根据具体需求进行各种定制。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI - 各类AI针对Excel分析对比

一个水果销量表&#xff0c;Excel包含多个年份sheet&#xff0c;需要提取某个品种的水果每年的销量&#xff0c;看看几个AI的分析结果吧 1、文心一言3.5&#xff08;不支持Excel&#xff09; 不支持上传Excel文件 2、 通义千问2.5&#xff08;完成★&#xff09; 顺利完成…

web前端学习笔记11

11. CSS3高级特效 11.1 CSS3变形 CSS3变形是一些效果的集合, 如平移、旋转、缩放、倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移、旋转、缩放、倾斜等变化 语法 transform:[transform-function] ; /* 设置变形函数,可以是一个,也可以是多…

js积累三(web页面一段时间未操作,退出登录)

//核心代码&#xff0c;已封装function CountDownLogout() {/* if 30 seconds no operation then logout */var maxTime 30; // seconds&#xff0c;可自行修改时长var time_time maxTime;/* 鼠标点击事件 */$(document).mousedown(function(){time_time maxTime; //…

重学java 42.多线程 等待唤醒机制案例分析

Strength is built under a heavy load,I am expecting to pick up all of my loads and travel on. —— 24.5.24 章节重点 1.会用wait和notify两个方法 2.会使用Lock锁对象 3.会利用Cal1able接口实现多线程 4.会使用线程池完成多线程 等待唤醒案例分析&#xff08;线程之间的…

视频监控汇聚平台LntonCVS通过GB/T28181国标协议实现视频监控平台的级联方案

近年来&#xff0c;随着网络视频监控应用范围的拓展&#xff0c;越来越多的政府部门和跨区域行业单位对视频监控的需求已经不局限于本地联网监控。他们正在探索在原有的本地联网监控基础上&#xff0c;建设省级乃至全国范围内的跨区域监控联网&#xff0c;以全面打造数据共享平…

这所211专硕22408复试线310分,学硕收调剂!辽宁大学计算机考研考情分析!

辽宁大学信息学院下设计算机科学与技术、电子信息科学与技术、通信工程、信息管理与信息系统、软件工程5个本科专业&#xff0c;有计算机软件与理论、计算机应用技术2个硕士学位授权点&#xff0c;软件工程和计算机技术两个专业硕士学位点&#xff0c;1个计算机应用研究所、1个…

【机器学习300问】94、什么是多任务学习?

一、多任务学习的定义 多任务学习&#xff08;Multi-Task Learning, MTL&#xff09;是一种机器学习范式&#xff0c;它允许一个模型同时学习执行多个相关但不完全相同的任务。这种方法的核心是&#xff1a;通过共享表示或权重&#xff0c;不同的任务可以在学习过程中相互促进&…

金蝶「起舞」,AI进化

能清晰感受到的是&#xff0c;金蝶仍然在不断进化&#xff0c;甚至伴随着AI时代的到来&#xff0c;它的进化信号愈发明显。 这些进化对应的具体动作是&#xff0c;把过去多年的服务模型整合成AI模型&#xff0c;把具体的服务“工艺”整理成流程编排能力&#xff0c;以及从740…

音视频及H264/H256编码相关原理

一、音视频封装格式原理&#xff1a; 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…

ECharts实现地图飞线

echarts版本&#xff1a;https://echarts.apache.org/zh/changelog.html v5.x.x版本&#xff1a;不提供china.js和china.json文件 v4.x.x版本&#xff1a;使用npm安装echarts&#xff0c;默认包含china.js和china.json文件 目录 一、Html工程 二、vue工程 三、vue工程 四、矢…

【错误解决】使用HuggingFaceInstructEmbeddings时的一个错误

起因&#xff1a;使用huggingface构建一个问答程序时出现的问题。 错误内容&#xff1a; 分析&#xff1a; 查看代码发现&#xff0c;HuggingFaceInstructEmbeddings和sentence-transformers模块版本不兼容导致。 可以明显看到方法参数不同。 解决&#xff1a; 安装sentenc…

windows平台vcpkg安装

1. 克隆vcpkg仓库 git clone https://github.com/microsoft/vcpkg 2.运行bootstrap-vcpkg.bat下载vcpkg.exe 3.运行验证 4.使用VCPKG安装OPENSSL 5.安装成功

【静态分析】在springboot使用太阿(Tai-e)03

参考&#xff1a;使用太阿&#xff08;Tai-e&#xff09;进行静态代码安全分析&#xff08;spring-boot篇三&#xff09; - 先知社区 1. JavaApi 提取 1.1 分析 预期是提取controller提供的对外API&#xff0c;例如下图中的/sqli/jdbc/vuln 先看一下如何用tai-e去获取router…

NFT Insider #131:Mocaverse NFT市值破3.5万ETH,The Sandbox 参加NFCsummit

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members&#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、…

0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案

大纲 几何结构构建点点集合线线集合面面集合几何信息集合 TypeHandlerSQL操作写入操作读取操作完整XML Mapper测试代码建表SQL总结代码参考资料 WKT全称是Well-Known Text。它是一种表达几何信息的字符串内容。比如点可以用WKT表示为POINT (3 3)&#xff1b;线可以用WKT表示为L…

uniapp使用内置的switch组件的问题

说明 开关选择器 属性说明 属性名类型默认值说明平台差异说明checkedBooleanfalse是否选中disabledBooleanfalse是否禁用不支持&#xff1a;抖音小程序、飞书小程序typeStringswitch 样式 有效值&#xff1a;switch、checkbox colorColorswitch的颜色&#xff0c;通css的co…

【Text2SQL 经典模型】X-SQL

论文&#xff1a;X-SQL: reinforce schema representation with context ⭐⭐⭐⭐ Microsoft, arXiv:1908.08113 X-SQL 与 SQLova 类似&#xff0c;使用 BERT style 的 PLM 来获得 representation&#xff0c;只是融合 NL question 和 table schema 的信息的方式不太一样&#…

响应式处理-一篇打尽

纯pc端响应式 pc端平常用到的响应式布局 大致就如下三种&#xff0c;当然也会有其他方法&#xff0c;欢迎评论区补充 将div height、width设置成100% flex布局 flex布局主要是将flex-wrap: wrap&#xff0c; 最后&#xff0c;你可以通过给子元素设置 flex 属性来控制它们的…

基于STM32实现智能风扇控制系统

目录 文章主题环境准备智能风扇控制系统基础代码示例&#xff1a;实现智能风扇控制系统 PWM控制风扇速度温度传感器数据读取串口通信控制应用场景&#xff1a;智能家居与环境调节问题解决方案与优化收尾与总结 1. 文章主题与命名 文章主题 本教程将详细介绍如何在STM32嵌入式…

Docker仅需3步搭建免费私有化的AI搜索引擎-FreeAskInternet!

简介 FreeAskInternet 是一个完全免费、私有且本地运行的搜索引擎&#xff0c;并使用 LLM 生成答案&#xff0c;无需 GPU。用户可以提出问题&#xff0c;系统会进行多引擎搜索&#xff0c;并将搜索结果合并到ChatGPT3.5 LLM中&#xff0c;并根据搜索结果生成答案。 什么是 Fr…