热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Java8将一个List<T>转为Map<String,T>的操作

这篇文章主要介绍了Java8将一个List<T>转为Map<String,T>的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

将 List 转为 Map

public class AnswerApp {
 public static void main(String[] args) throws Exception {
  List names = Lists.newArrayList("Answer", "AnswerAIL", "AI");
  Map map = names.stream().collect(Collectors.toMap(v -> v, v -> 1));
  System.out.println(map);
 }
}

程序运行输出

{Answer=1, AnswerAIL=1, AI=1}

将 List 转为 Map

public static void main(String[] args) throws Exception {
 List users = new ArrayList<>();
 for (int i = 0; i <3; i++) {
  users.add(new User("answer" + i, new Random().nextInt(100)));
 }
 System.out.println(JSON.toJSONString(users)); 
 System.out.println(); 
 Map map = users.stream().collect(Collectors.toMap(User::getName, User::getAge));
 System.out.println(map);
}

程序运行输出

[{"age":78,"name":"answer0"},{"age":89,"name":"answer1"},{"age":72,"name":"answer2"}]
{answer2=72, answer1=89, answer0=78}

将 List 转为 Map

实现方式1

public class AnswerApp {
 public static void main(String[] args) throws Exception {
  List users = new ArrayList<>();
  for (int i = 0; i <3; i++) {
   // 改为此代码, 转map时会报错 Duplicate key User
 // users.add(new User("answer", new Random().nextInt(100)));
   users.add(new User("answer" + i, new Random().nextInt(100)));
  }
  System.out.println(JSON.toJSONString(users));
  System.out.println();
  Map map = users.stream().collect(Collectors.toMap(User::getName, Function.identity()));
  System.out.println(JSON.toJSONString(map));
 }
}

该方式如果 map 的 key(如上述例子的 User::getName 的值) 重复, 会抛错java.lang.IllegalStateException: Duplicate key User

程序运行输出

[{"age":22,"name":"answer0"},{"age":79,"name":"answer1"},{"age":81,"name":"answer2"}]
{"answer2":{"age":81,"name":"answer2"},"answer1":{"age":79,"name":"answer1"},"answer0":{"age":22,"name":"answer0"}}

实现方式2

public class AnswerApp {
 public static void main(String[] args) throws Exception {
  List users = new ArrayList<>();
  for (int i = 0; i <3; i++) {
   users.add(new User("answer", new Random().nextInt(100)));
  }
  System.out.println(JSON.toJSONString(users));
  System.out.println();
 
 // 如果 key 重复, 则根据 冲突方法 ·(key1, key2) -> key2· 判断. 解释: key1 key2 冲突时 取 key2 
  Map map = users.stream().collect(Collectors.toMap(User::getName, Function.identity(), (key1, key2) -> key2));
  System.out.println(JSON.toJSONString(map));
 }
} 

程序运行输出

[{"age":24,"name":"answer"},{"age":89,"name":"answer"},{"age":68,"name":"answer"}]
{"answer":{"age":68,"name":"answer"}}

如果改为 (key1, key2) -> key1 则输出 {"answer":{"age":24,"name":"answer"}}

User 实体

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
 private Long id;
 private String name;
 private Integer age;
 public User(String name) {
  this.name = name;
 }
 public User(String name, Integer age) {
  this.name = name;
  this.age = age;
 }
}

补充:java8中使用Lambda表达式将list中实体类的两个字段转Map

代码:

List list = new ArrayList<>();
Map map = list.stream().collect(Collectors.toMap(Entity::getId, Entity::getType));

常用的lambda表达式:

**
 * List -> Map
 * 需要注意的是:
 * toMap 如果集合对象有重复的key,会报错Duplicate key ....
 * apple1,apple12的id都为1。
 * 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
 */
Map appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
 
安照某一字段去重
list = list.stream().filter(distinctByKey(p -> ((ModCreditColumn) p).getFieldCode())).collect(Collectors.toList());
 
List unitNetValue = listIncreaseDto.stream().map(IncreaseDto :: getUnitNetValue).collect(Collectors.toList());
 
//求和 对象List
BigDecimal allFullMarketPrice = entityList.stream().filter(value -> value.getFullMarketPrice()!= null).map(SceneAnalysisRespVo::getFullMarketPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 
 List naturalDayList;
 BigDecimal total = naturalDayList.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
 
分组函数
Map> groupMap = total.getGroupList().stream().collect(Collectors.groupingBy(SceneAnalysisRespVo::getVmName));
 
//DV01之和
BigDecimal allDV01 = values.stream().filter(sceneAnalysisRespVo -> sceneAnalysisRespVo.getDv() != null).map(SceneAnalysisRespVo::getDv).reduce(BigDecimal.ZERO, BigDecimal::add);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。


推荐阅读
  • 在macOS环境下使用Electron Builder进行应用打包时遇到签名验证失败的问题,具体表现为签名后spctl命令检测到应用程序未通过公证(Notarization)。本文将详细探讨该问题的原因及解决方案。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 在网页开发中,页面加载速度是一个关键的用户体验因素。为了提升加载效率,避免在PageLoad事件中进行大量数据绑定操作,可以采用异步加载和特定控件来优化页面加载过程。 ... [详细]
  • 探讨在循环中调用$.post()时,回调函数为何会在循环结束后才开始执行,并提供解决方案和优化建议。 ... [详细]
author-avatar
lmaster
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有