iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java8中List转Map(Collectors.toMap) 的技巧分享
  • 284
分享到

Java8中List转Map(Collectors.toMap) 的技巧分享

2024-04-02 19:04:59 284人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

前言 在实际项目中我们经常会用到 List 转 Map 操作,在过去我们可能使用的是 for 循环遍历的方式。举个例子: 先定义类: // 简单对象 @Accessors(ch

前言

在实际项目中我们经常会用到 List 转 Map 操作,在过去我们可能使用的是 for 循环遍历的方式。举个例子:

先定义类:


// 简单对象 
@Accessors(chain = true) // 链式方法 
@lombok.Data
class User {
    private String id;
    private String name;
}

然后有这样一个 List:


List<User> userList = Lists.newArrayList(
        new User().setId("A").setName("张三"),
        new User().setId("B").setName("李四"),
        new User().setId("C").setName("王五")
);

我们希望转成 Map 的格式为:

A-> 张三
B-> 李四
C-> 王五

过去的做法(循环):


Map<String, String> map = new HashMap<>();
for (User user : userList) {
    map.put(user.getId(), user.getName());
}

使用 Java8 特性

Java8 中新增了 Stream 特性,使得我们在处理集合操作时更方便了。

以上述例子为例,我们可以一句话搞定:


userList.stream().collect(Collectors.toMap(User::getId, User::getName));

当然,如果希望得到 Map 的 value 为对象本身时,可以这样写:


userList.stream().collect(Collectors.toMap(User::getId, t -> t));

 或:


userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

关于 Collectors.toMap 方法

Collectors.toMap 有三个重载方法:


toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
        BinaryOperator<U> mergeFunction);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
        BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);

参数含义分别是:

  1. keyMapper:Key 的映射函数
  2. valueMapper:Value 的映射函数
  3. mergeFunction:当 Key 冲突时,调用的合并方法
  4. mapSupplier:Map 构造器,在需要返回特定的 Map 时使用

还是用上面的例子,如果 List 中 userId 有相同的,使用上面的写法会抛异常:


List<User> userList = Lists.newArrayList(
        new User().setId("A").setName("张三"),
        new User().setId("A").setName("李四"), // Key 相同 
        new User().setId("C").setName("王五")
);
userList.stream().collect(Collectors.toMap(User::getId, User::getName));

// 异常:
java.lang.IllegalStateException: Duplicate key 张三 
    at java.util.stream.Collectors.lambda$throwingMerger$114(Collectors.java:133)
    at java.util.HashMap.merge(HashMap.java:1245)
    at java.util.stream.Collectors.lambda$toMap$172(Collectors.java:1320)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at Test.toMap(Test.java:17)
    ...

这时就需要调用第二个重载方法,传入合并函数,如:


userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1 + n2));

// 输出结果:
A-> 张三李四 
C-> 王五 

第四个参数(mapSupplier)用于自定义返回 Map 类型,比如我们希望返回的 Map 是根据 Key 排序的,可以使用如下写法:


List<User> userList = Lists.newArrayList(
        new User().setId("B").setName("张三"),
        new User().setId("A").setName("李四"),
        new User().setId("C").setName("王五")
);
userList.stream().collect(
    Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1, TreeMap::new)
);

// 输出结果:
A-> 李四 
B-> 张三 
C-> 王五

总结

到此这篇关于Java8中List转Map(Collectors.toMap) 的文章就介绍到这了,更多相关Java8 List转Map(Collectors.toMap)内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java8中List转Map(Collectors.toMap) 的技巧分享

本文链接: https://www.lsjlt.com/news/131459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java8中List转Map(Collectors.toMap) 的技巧分享
    前言 在实际项目中我们经常会用到 List 转 Map 操作,在过去我们可能使用的是 for 循环遍历的方式。举个例子: 先定义类: // 简单对象 @Accessors(ch...
    99+
    2024-04-02
  • java8中list转map怎么实现
    在Java 8中,可以使用Collectors.toMap()方法将List转换为Map。以下是一个简单的示例代码: 假设有一个类P...
    99+
    2024-03-01
    java8
  • Java8 中使用Stream 让List 转 Map使用问题小结
    在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查。 空指针风险 java.lang.Nul...
    99+
    2024-04-02
  • Golang 中实现页面跳转的技巧分享
    标题:Golang 中实现页面跳转的技巧分享 在开发Web应用程序时,页面跳转是常见的需求。在 Golang 中,实现页面跳转并不复杂,但有一些技巧可以帮助我们更高效地完成这项任务。本...
    99+
    2024-03-05
    golang 页面跳转 技巧分享
  • PHP开发中常用的301跳转技巧分享
    PHP开发中常用的301跳转技巧分享 在网站开发中,301跳转是一种非常重要的技术手段,它可以告诉搜索引擎该网页已永久移动到另一个地址,帮助维护网站的搜索引擎优化。下面将介绍一些在PH...
    99+
    2024-04-02
  • 如何在Java8中将List<T>转为Map<String,T>
    这篇文章主要介绍了如何在Java8中将List<T>转为Map<String,T>,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:Java是什么Java是一门面向对...
    99+
    2023-06-06
  • JS利用map整合双数组的小技巧分享
    目录前言模拟数据合并后数据合并思路代码展示&解析第一步第二步第三步第四步全部代码总结前言 最近因公司业务需求编写ECharts图表展示相关公司阶段型业务相关数据变化,需要服...
    99+
    2024-04-02
  • PHP中实现字符转ASCII码的技巧分享
    PHP中实现字符转ASCII码的技巧分享 在PHP开发中,有时候我们需要将字符转换为ASCII码,这在处理字符串、加密算法等方面是非常常见的操作。本篇文章将分享一些PHP中实现字符转A...
    99+
    2024-04-02
  • dedecms网站中实现编码转换的技巧分享
    在 dedecms 网站开发过程中,有时候会遇到需要对编码进行转换的情况,比如将中文字符转换为 UTF-8 编码。本文将分享一些实现编码转换的技巧,并提供具体的代码示例帮助开发人员更好...
    99+
    2024-03-14
    dedecms 技巧分享 编码转换
  • html怎么跳转页面?技巧分享
    HTML跳转是指从一个网页链接跳转到另一个网页的过程,也可以是同一个页面内部的跳转,比如从文章的顶部跳转到底部。下面我们一起来看一下HTML跳转的方法和技巧。一、超链接跳转超链接是HTML中最常见的跳转方式,通过在HTML中添加超链接标签,...
    99+
    2023-05-14
  • dedecms网站中实现编码转换的技巧分享
    在 dedecms 网站开发过程中,有时候会遇到需要对编码进行转换的情况,比如将中文字符转换为 UTF-8 编码。本文将分享一些实现编码转换的技巧,并提供具体的代码示例帮助开发人员更好...
    99+
    2024-03-14
    dedecms 技巧分享 编码转换
  • Golang的数据转换技巧与实例分享
    Golang的数据转换技巧与实例分享引言:Golang是一种功能强大的编程语言,在处理各种数据类型和格式转换时提供了很多方便的功能和技巧。本文将分享一些在Golang中进行数据转换的实用技巧,并提供具体的代码示例。一、字符串与整数之间的转换...
    99+
    2023-12-23
    类型转换 字符串操作 数据解析
  • java8中Stream list to Map key重复value合并到Collectio的示例分析
    这篇文章给大家分享的是有关java8中Stream list to Map key重复value合并到Collectio的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java8 Stream list ...
    99+
    2023-06-15
  • Java中Stream的一些技巧分享
    这篇文章主要介绍“Java中Stream的一些技巧分享”,在日常操作中,相信很多人在Java中Stream的一些技巧分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Stream的一些技巧分享”的疑...
    99+
    2023-06-20
  • 分享MySQL中锁的使用技巧
    MySQL 锁的使用技巧分享随着数据库应用的日益广泛,对数据库的并发控制和数据完整性要求也越来越高。在MySQL数据库中,锁是一种重要的并发控制手段,可以有效地保护数据的完整性和一致性。本文将对MySQL锁的使用技巧进行详细分享,并提供具体...
    99+
    2023-12-21
    MySQL 技巧
  • 将list快速转换为numpy的技巧
    快速将list转换为numpy的小窍门,需要具体代码示例 在数据分析和科学计算中,Numpy是一个非常重要的库。它提供了高效地进行数值计算和处理数组的功能。对于想要从Python的列表(list)转换为Numpy数组的人来说,下...
    99+
    2024-01-26
    Numpy list 转换
  • CSS常用的技巧分享
    这篇文章主要讲解了“CSS常用的技巧分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS常用的技巧分享”吧!Box-sizing尽管box-sizing...
    99+
    2024-04-02
  • css布局的技巧分享
    这篇文章主要讲解了“css布局的技巧分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css布局的技巧分享”吧!1.max-width:当页面左右宽度缩小时...
    99+
    2024-04-02
  • Pandas实用的技巧分享
    这篇文章主要讲解了“Pandas实用的技巧分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pandas实用的技巧分享”吧!01 使用apply拆分文本Pandas 中 apply 函数,应...
    99+
    2023-06-15
  • Java8中Stream API的技巧有哪些
    本篇内容介绍了“Java8中Stream API的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Stream简介Jav...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作