Java lambda list转换map时,把多个参数拼接作为key操作

我就废话不多说了,大家还是直接看代码吧~

Map<String, Parts> partsMap = synList.stream().collect(Collectors.toMap(k ->

k.getOe()+k.getOeId()+k.getPartGroupId()+k.getStdPartId()+k.getBrandCode(), part -> part));

补充知识:Java8 Collectors.toMap的两个大坑

Collectors.toMap()方法的正常使用示例

List<StudentDTO> studentDTOS = Lists.newArrayList();
studentDTOS.add(new StudentDTO(1,"xixi"));
studentDTOS.add(new StudentDTO(2,"houhou"));
studentDTOS.add(new StudentDTO(3,"maomi"));
Map<Integer, String> collect = studentDTOS.stream().collect(
 Collectors.toMap(StudentDTO::getStudentId, StudentDTO::getStudentName));
System.out.println(JSON.toJSON(collect)); // {"1":"xixi","2":"houhou","3":"maomi"}

一. 坑1:Duplicate Key时抛出IllegalStateException异常

1. 概述

按照常规Java的Map思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖。

但Java8中的Collectors.toMap()却不是这样。当key重复时,该方法默认会抛出IllegalStateException异常。

2. 大坑复现

public void streamToMap1() {
 List<StudentDTO> studentDTOS = Lists.newArrayList();
 studentDTOS.add(new StudentDTO(1,"xixi"));
 studentDTOS.add(new StudentDTO(1,"houhou"));
 studentDTOS.add(new StudentDTO(3,"maomi"));
 Map<Integer, String> collect = studentDTOS.stream()
  .collect(Collectors.toMap(StudentDTO::getStudentId, StudentDTO::getStudentName));
 System.out.println(JSON.toJSON(collect));
}

输出结果

3. 大坑解决

法1:将toMap方法修改成如下形式,这样就可以使用新的value覆盖原有value。

studentDTOS.stream().collect(Collectors.toMap(StudentDTO::getStudentId,

StudentDTO::getStudentName,(oldValue, newValue) -> newValue));

输出结果:{"1":"houhou","3":"maomi"}

法2:如果需要保留同一个key下所有的值,则可以对value做简单的拼接,如下:

studentDTOS.stream().collect(Collectors.toMap(StudentDTO::getStudentId,

StudentDTO::getStudentName,(oldValue, newValue) -> oldValue + "," + newValue));

输出结果:

{"1":"xixi,houhou","3":"maomi"}

二. 坑2:value为空时抛出NullPointerException异常

1. 概述

当要转化的map的value值中包含空指针时, 会抛出NullPointerException异常。

2. 大坑复现

public void streamToMap2() {
 List<StudentDTO> studentDTOS = Lists.newArrayList();
 studentDTOS.add(new StudentDTO(1,"xixi"));
 studentDTOS.add(new StudentDTO(2,"houhou"));
 studentDTOS.add(new StudentDTO(3,null));
 Map<Integer, String> collect = studentDTOS.stream().collect(Collectors
 .toMap(StudentDTO::getStudentId, StudentDTO::getStudentName));
 System.out.println(JSON.toJSON(collect));
}

输出结果

3. 大坑解决

3.1 法1:value值判空设置

说明:如果是null,则设置成一个特定值。

studentDTOS.stream().collect(Collectors.toMap(StudentDTO::getStudentId, studentDTO

-> studentDTO.getStudentName()==null?"":studentDTO.getStudentName()));

输出结果:

{"1":"xixi","2":"houhou","3":""}

3.2 法2:使用collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)方法构建

说明:该方法允许null值。

Map<Integer, String> collect = studentDTOS.stream().collect(HashMap::new,
 (n, v) -> n.put(v.getStudentId(), v.getStudentName()), HashMap::putAll);
for(Map.Entry<Integer, String> entry:collect.entrySet()){
 System.out.println(entry.getKey()+"="+entry.getValue());
}

输出结果

1=xixi
2=houhou
3=null

3.3 使用Optional对值进行包装

Map<Integer, Optional<String>> collect = studentDTOS.stream().collect(Collectors
 .toMap(StudentDTO::getStudentId,
 studentDTO -> Optional.ofNullable(studentDTO.getStudentName())));

for(Map.Entry<Integer, Optional<String>> entry:collect.entrySet()){
 System.out.println(entry.getKey()+"="+entry.getValue().orElse(""));
}

输出结果

1=xixi
2=houhou
3=

以上这篇Java lambda list转换map时,把多个参数拼接作为key操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Java 8 Lambda表达式将实体映射到DTO的操作

    当我们需要将DTO转换为实体(Hibernate实体等)并向后转换时,我们都会面临混乱的开销代码. 在我的示例中,我将用Java 8演示代码如何变得越来越短. 让我们创建目标DTO: public class ActiveUserListDTO { public ActiveUserListDTO() { } public ActiveUserListDTO(UserEntity userEntity) { this.username = userEntity.getUsername(); ..

  • java 三种将list转换为map的方法详解

    java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) 传统方法 假设有某个类如下 class Movie { private Integer rank; private String description; public Movie(Integer rank, String description) { super(); this.rank = rank; this.description = description; } public Int

  • 详解Java8新特性Stream之list转map及问题解决

    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List<Person> list = new ArrayList(); list.add(new Person("1001", "小A")); list.add(new Person("1002", "小B")); list.add(new Person

  • java8快速实现List转map 、分组、过滤等操作

    利用java8新特性,可以用简洁高效的代码来实现一些数据处理. 定义1个Apple对象: public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) { this.id = id; this.name =

  • 在Java 8中将List转换为Map对象方法

    假设有一个员工对象: <b>public</b> <b>class</b> Employee { <font><i>// member variables</i></font><font> <b>private</b> <b>int</b> empId; <b>private</b> String empName; <b&

  • Java lambda list转换map时,把多个参数拼接作为key操作

    我就废话不多说了,大家还是直接看代码吧~ Map<String, Parts> partsMap = synList.stream().collect(Collectors.toMap(k -> k.getOe()+k.getOeId()+k.getPartGroupId()+k.getStdPartId()+k.getBrandCode(), part -> part)); 补充知识:Java8 Collectors.toMap的两个大坑 Collectors.toMap()方法

  • Java Lambda List转Map代码实例

    在有些开发场景,需要对 List 对象列表进行过滤处理,并将有用的数据存放到Map中. 例如:告警对象,包含告警uuid(alarmUuid) 和 设备uuid(objUuid),需要对 objUuid = -1的告警进行过滤,并将过滤后告警数据的alarmUuid和 objUuid以键值对的形式保存到Map中. 1.告警对象定义如下: /** * Created by Miracle Luna on 2020/3/16 */ public class AlarmInfoResponse { p

  • Java 中的 Lambda List 转 Map 的多种方法详解

    目录 故事背景 公共代码 方式一(partitioningBy 分两组) 方式二(groupingBy 分多组) 方式三(toMap 自定义<Key, Value>) 故事背景 我们平时在项目中经常会遇到 List 转 Map 的情况,但是传统的方式又显得太臃肿,于是就想到 Lambda 神器,今天我们就来看看都有哪几种转换方式(List -> Map) 公共代码 // Person 实体类 @Data class Person { private String uuid; privat

  • java实体对象与Map之间的转换工具类代码实例

    这篇文章主要介绍了java实体对象与Map之间的转换工具类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Map接口中键和值一一映射. 可以通过键来获取值. 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值. 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常

  • Java lambda表达式实现Flink WordCount过程解析

    这篇文章主要介绍了Java lambda表达式实现Flink WordCount过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>

  • 解决使用stream将list转map时,key重复导致报错的问题

    要将List对象集合转为map集合,可以通过stream流的形式快速实现转换: //三个Users对象组成一个List集合 List<Users> list = new ArrayList<>(); list.add(Users.builder().userName("11").userId(1).build()); list.add(Users.builder().userName("11").userId(2).build()); lis

  • Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增强了集合库. Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及 java.util.stream 包. 流(stream)就如同迭代器(iterator),但附加了许多额外的功能.

  • Java Lambda 表达式详解及示例代码

    Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码. Lambda 基本语法 Lambda 的基本结构为 (arguments) -> body,有如下几种情况: 参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.o

  • Java 遍历list和map的方法

    java 遍历list package com.tiandy.core.rest; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * List 集合的循环遍历 * @data 2020.12.12 * */ public class TestList { public static void main(String[] args) { // 循环遍历List的4中方法 List<

  • Java Lambda 表达式源码解析

    Java Lambda 源码分析 问题: Lambda 表达式是什么?JVM 内部究竟是如何实现 Lambda 表达式的?为什么要这样实现? 一.基本概念 1.Lambda 表达式 下面的例子中,() -> System.out.println("1") 就是一个 Lambda 表达式.Java 8 中每一个 Lambda 表达式必须有一个函数式接口与之对应.Lambda 表达式就是函数式接口的一个实现. @Test public void test0() { Runnable

随机推荐