当前位置: 首页 > news >正文

Java Stream:List分组成Map或LinkedHashMap

在Java中,使用Stream API可以轻松地对集合进行操作,包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换,同时假设List中的元素是User对象。


1. 数据准备

List<User> list = new ArrayList<>();
list.add(new User(1, "张三", "我是张三01"));
list.add(new User(2, "张三", "我是张三02"));
list.add(new User(3, "李四", "我是李四01"));
list.add(new User(4, "李四", "我是李四02"));
list.add(new User(5, "王五", "我是王五01"));
list.add(new User(6, "王五", "我是王五02"));

2. List转Map(无序-默认)

List转Map有两种Map格式,分别是 Map<String, User>Map<String, List>,下面我将分别展示:

2.1 List转Map<String, User>

转换成Map<String, User>我们需要使用到Collectors.toMap方法:

//通过名字进行分组,如果名字重复的话只取第一个:List转Map<String, User>
Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1));
System.out.println(map01);

执行结果:

{
李四=User(id=3, name=李四, note=我是李四01), 
张三=User(id=1, name=张三, note=我是张三01), 
王五=User(id=5, name=王五, note=我是王五01)
}

2.2 List转Map<String, List<User>>

转换成Map<String, List<User>>我们需要使用到Collectors.groupingBy方法:

//通过名字进行分组,如果名字重复的话就分组成List:List转Map<String, List<User>>
Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName));
System.out.println(map02);

执行结果:

{
李四=[User(id=3, name=李四, note=我是李四01), User(id=4, name=李四, note=我是李四02)], 
张三=[User(id=1, name=张三, note=我是张三01), User(id=2, name=张三, note=我是张三02)], 
王五=[User(id=5, name=王五, note=我是王五01), User(id=6, name=王五, note=我是王五02)]
}

我们可以看到:map中打印出来的执行结果并没有按照List中添加的顺序打印的

3. List转LinkedHashMap(有序)

List转LinkedHashMap也有两种Map格式,分别是 LinkedHashMap<String, User>LinkedHashMap<String, List>,下面我将分别展示:

3.1 List转LinkedHashMap<String, User>

转换成LinkedHashMap<String, User>我们需要使用到Collectors.toMap方法:

//通过名字进行分组,如果名字重复的话只取第一个:List转LinkedHashMap<String, User>
Map<String, User> map03 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new));
System.out.println(map03);

执行结果:

{
张三=User(id=1, name=张三, note=我是张三01), 
李四=User(id=3, name=李四, note=我是李四01), 
王五=User(id=5, name=王五, note=我是王五01)
}

3.2 List转LinkedHashMap<String, List<User>>

转换成LinkedHashMap<String, List<User>>我们需要使用到Collectors.groupingBy方法:

//通过名字进行分组,如果名字重复的话就分组成List:List转LinkedHashMap<String, List<User>>
Map<String, List<User>> map04 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList()));
System.out.println(map04);

执行结果:

{
张三=[User(id=1, name=张三, note=我是张三01), User(id=2, name=张三, note=我是张三02)], 
李四=[User(id=3, name=李四, note=我是李四01), User(id=4, name=李四, note=我是李四02)], 
王五=[User(id=5, name=王五, note=我是王五01), User(id=6, name=王五, note=我是王五02)]
}

我们可以看到:map中打印出来的执行结果是按照List中添加的顺序打印的

4. 总结

在List转Map的过程中:
如果我们对Map中的顺序没要求,我们可以通过stream流将List转换为默认的HMap即可
如果我们对Map中的顺序有要求,我们可以通过stream流将List转换为LinkedHashMap才行

5. 全部代码

public static void test1() {List<User> list = new ArrayList<>();list.add(new User(1, "张三", "我是张三01"));list.add(new User(2, "张三", "我是张三02"));list.add(new User(3, "李四", "我是李四01"));list.add(new User(4, "李四", "我是李四02"));list.add(new User(5, "王五", "我是王五01"));list.add(new User(6, "王五", "我是王五02"));//通过名字进行分组,如果名字重复的话只取第一个:List转Map<String, User>Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1));System.out.println(map01);//通过名字进行分组,如果名字重复的话就分组成List:List转Map<String, List<User>>Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName));System.out.println(map02);//通过名字进行分组,如果名字重复的话只取第一个:List转LinkedHashMap<String, User>Map<String, User> map03 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new));System.out.println(map03);//通过名字进行分组,如果名字重复的话就分组成List:List转LinkedHashMap<String, List<User>>Map<String, List<User>> map04 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList()));System.out.println(map04);
}
public class User {private Integer id;private String name;private String note;
}

相关文章:

Java Stream:List分组成Map或LinkedHashMap

在Java中&#xff0c;使用Stream API可以轻松地对集合进行操作&#xff0c;包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换&#xff0c;同时假设List中的元素是User对象。 1. 数据准备 List<User> list new ArrayList<>(…...

vue2+elementui使用MessageBox 弹框$msgbox自定义VNode内容:实现radio

虽说实现下面的效果&#xff0c;用el-dialog很轻松就能搞定。但是这种简单的交互&#xff0c;我更喜欢使用MessageBox。 话不多说&#xff0c;直接上代码~ <el-button type"primary" size"mini" click"handleApply()" >处理申请</el-b…...

OC 实现手指滑动拖动View

RPReplay_Final1699613924 实现手指滑动拖动View 支持手势移动的控件 支持 Masonry frame 布局 使用富文本 也支持自动高度 核心代码 - (void)handlePanGesture:(UIPanGestureRecognizer *)p {CGPoint panPoint [p locationInView:self.view];CGPoint currentViewPoint _dr…...

多级缓存之实现多级缓存

多级缓存的实现离不开Nginx编程&#xff0c;而Nginx编程又离不开OpenResty。 1. OpenResty快速入门 我们希望达到的多级缓存架构如图&#xff1a; 其中&#xff1a; windows上的nginx用来做反向代理服务&#xff0c;将前端的查询商品的ajax请求代理到OpenResty集群 OpenRest…...

React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)

文件目录 Proxying in Development http-proxy-middleware fetch_get fetch 是否成功 axios 全局处理 antd UI库 更改主题 使用css module的情况下修改第三方库的样式 支持sass & less Proxying in Development 在开发模式下&#xff0c;如果客户端所在服务器跟后…...

在gitlab中指定自定义 CI/CD 配置文件

文章目录 1. 介绍2. 配置操作3. 配置场景3.1 CI/CD 配置文件在当前项目step1&#xff1a;在当前项目中创建目录&#xff0c;编写流水线文件存放在该目录中step2&#xff1a;在当前项目中配置step3&#xff1a;运行流水线测试 3.2 CI/CD 配置文件位于外部站点上step1&#xff1a…...

(论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking

文献阅读笔记 简介 题目 Learning a Deep Compact Image Representation for Visual Tracking 作者 N Wang, DY Yeung 原文链接 Learning a Deep Compact Image Representation for Visual Tracking (neurips.cc) 关键词 Object tracking、DLT、SDAE 研究问题 track…...

浅谈设计模式

文章目录 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 三、建造者模式 四、代理模式 设计模式是前辈们对代码开发的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解…...

企业年会/年终活动如何邀请媒体记者报道?

​媒体邀约是企业或组织进行宣传的重要手段之一。通过邀请媒体参加活动&#xff0c;可以增加活动的曝光度和知名度&#xff0c;吸引更多的关注和参与。同时&#xff0c;媒体报道还可以提高企业或组织的权威性和可信度&#xff0c;从而让公众更容易接受其传达的信息。 企业年会或…...

C语言如何执行HTTP GET请求

在现代互联网时代&#xff0c;网络数据的获取和分析变得越来越重要。无论是为了研究市场趋势&#xff0c;还是为了收集信息进行数据分析&#xff0c;编写一个网络爬虫可以帮助我们自动化这一过程。在这篇文章中&#xff0c;我们将使用C语言和libcurl库来编写一个简单的网络爬虫…...

.Net 6 Nacos日志控制台疯狂发输出+Log4Net日志过滤

我们的项目配置了Log4Net 作为日志输出工具&#xff0c;在引入Nacos后&#xff0c;控制台和日志里疯狂输出nacos心跳日志和其他相关信息&#xff0c;导致自己记录的信息被淹没了&#xff0c;找了很多解决办法&#xff1a; 1、提高nacos日志级别&#xff0c;然后再屏蔽相应级别…...

Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)

文章目录 AbstractIntroduction引入问题1&#xff09; Sample level imbalance2) Feature level imbalance3) Objective level imbalance进行解决贡献 Related Work&#xff08;他人的work&#xff0c;捎带与我们的对比&#xff09;Model architectures for object detection&a…...

Redis的内存淘汰策略分析

概念 LRU 是按访问时间排序&#xff0c;发生淘汰的时候&#xff0c;把访问时间最久的淘汰掉。LFU 是按频次排序&#xff0c;一个数据被访问过&#xff0c;把它的频次 1&#xff0c;发生淘汰的时候&#xff0c;把频次低的淘汰掉。 几种LRU策略 以下集中LRU测率网上有很多&am…...

git命令之遭遇 ignore罕见问题解决

我先来讲讲背景 我的一些文件在ignore了&#xff0c;不会被提交到远程仓库&#xff0c;这时候我的远程仓库中是没有这几个文件的&#xff0c;这时候我如果使用 git reset 的话这时候除了那几个 ignore 的文件以外都被更新的&#xff0c;但是如果我不需要这几个被 ignore 的文件…...

torch DDP多卡训练教程记录

参考 简明教程看这里 --> pytorch分布式训练 和这篇&#xff1a; [PyTorch]> DDP系列第一篇&#xff1a;入门教程 --》 详细解答了pipeline DDP原理篇 --> DDP系列第二篇&#xff1a;实现原理与源代码解析 --》 主要讲 all_reduce 和 sample 的实现 减少GPU占用看这里…...

Jenkins CICD过程常见异常

1 Status [126] Exception when publishing, exception message [Exec exit status not zero. Status [126] 1.1 报错日志 SSH: EXEC: STDOUT/STDERR from command [/app/***/publish.sh] ... bash: /app/***/publish.sh: Permission denied SSH: EXEC: completed after 200…...

Java11新增特性

前言 在前面的文章中&#xff0c;我们已经介绍了 Java9的新增特性 和 Java10的新增特性 ,下面我们书接上文&#xff0c;来介绍一下Java11的新增特性 版本简介 Java 11 是 Java 平台的最新版本&#xff0c;于2018年9月25日发布。这个版本是自Java 8以来最重要的更新之一&…...

安卓常见设计模式13------过滤器模式(Kotlin版)

W1 是什么&#xff0c;什么是过滤器模式&#xff1f;​ 过滤器模式&#xff08;Filter Pattern&#xff09;是一种常用的结构型设计模式&#xff0c;用于根据特定条件过滤和筛选数据。 2. W2 为什么&#xff0c;为什么需要使用过滤器模式&#xff0c;能给我们编码带来什么好处…...

使用spark进行递归的可行方案

在实际工作中会遇到&#xff0c;最近有需求将产品炸开bom到底层&#xff0c;但是ERP中bom数据在一张表中递归存储的&#xff0c;不循环展开&#xff0c;是无法知道最底层原材料是什么。 在ERP中使用pl/sql甚至sql是可以进行炸BOM的&#xff0c;但是怎么使用spark展开&#xff0…...

Spring -Spring之依赖注入源码解析(下)--实践(流程图)

IOC依赖注入流程图 注入的顺序及优先级&#xff1a;type-->Qualifier-->Primary-->PriOriry-->name...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...