1、指定key-value,value是对象中的某个属性值。

 Map<Integer,String> userMap = userList.stream().collect(Collectors.toMap(User::getId,User::getName));

2、指定key-value,value是对象本身

User->User 是一个返回本身的lambda表达式

Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId,User->User));

Function.identity()是简洁写法,也是返回对象本身

Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

3、返回其他Map

解决了Key冲突并转为了TreeMap

userList.stream().collect(Collectors.toMap(User::getName, Function.identity(), (oldVal, newVal) -> newVal, TreeMap::new));

4、解决重复key问题

如果生成Map时有重复key(通过key类型的equals方法来判断)就会报错:java.lang.IllegalStateException: Duplicate key。

当发生重复时这里选择第二个key覆盖第一个key的value值,当然如果需要第一个key的value值那就选择oldKey(可提前先进行指定规则的排序)

Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(oldKey,newKey)->newKey));

PS:当然也可以提前将集合进行去重处理(stream根据指定字段去重)再进行简单的toMap操作。

5、其他示例

  • 重复时将前面的value 和后面的value拼接起来
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 ));

//或者将其值相加
Map<String, BigDecimal> map = list.stream().collect(Collectors.toMap(Person::getNo, Person::amount,BigDecimal::add));
  • value转为其他DTO实体并解决key重复问题
Map<Integer, ProductCategoryResultDTO> resultDTOMap = byCategoryFidAndEnvironmentTag.stream()
.collect(Collectors.toMap(ProductCategory::getCategoryId, v -> {
ProductCategoryResultDTO productCategoryResultDTO = new ProductCategoryResultDTO();
productCategoryResultDTO.setStatus(v.getUplowState());
return productCategoryResultDTO;
}, (key1, key2) -> key2));
  • 代码实战:
public static void main(String[] args) throws JsonProcessingException {
UserInfo u1 = new UserInfo(1, "张三");
UserInfo u2 = new UserInfo(2, "李四");
UserInfo u3 = new UserInfo(3, "王五");
UserInfo u4 = new UserInfo(4, "赵六1");
UserInfo u5 = new UserInfo(4, "赵六2");
List<UserInfo> list = Arrays.asList(u1,u2,u3,u4,u5); Map<Integer, String> map = list.stream()
.collect(Collectors.toMap(UserInfo::getId, UserInfo::getUserName, (key1, key2) -> key1 + "," + key2));
String mapStr = new ObjectMapper().writeValueAsString(map);
System.out.println(mapStr); Set<Object> set = new HashSet<>();
Map<Integer, String> map1 = list.stream()
.collect(Collectors.toMap(UserInfo::getId, UserInfo::getUserName, (key1, key2) -> {
set.add(key1);
return key1;
}));
System.out.println(new ObjectMapper().writeValueAsString(map1));
System.out.println("set:" + set);
}

执行结果:

stream流中toMap()api和Duplicate key问题的更多相关文章

  1. Stream流中的常用方法_Foreach-Stream流中的常用方法_filter

    Stream流中的常用方法_Foreach 流模型的操作很丰富,这里介绍一些常用的API.这些方法可以被分成两种︰·延迟方法∶返回值类型仍然是Stream,接口自身类型的方法,因此支持链式调用.(除了 ...

  2. JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  3. 【JDK8】JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  4. Stream流的特点_只能使用一次和Stream流中的常用方法_map

    Stream流的特点_只能使用一次 public class FilterStudy04 { public static void main(String[] args) { //创建一个Stream ...

  5. Stream流中的常用方法foeEach和Stream流中的常用方法filter

    延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...

  6. Stream流中的常用方法_skip-Stream流中的常用方法_concat

    Stream流中的常用方法_skip 如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流∶ 如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流.基本使用: Strea ...

  7. Stream流的特点_只能用一次-Stream流中的常用方法_map

    Stream流的特点_只能用一次 Stream流属于管道流,只能被消费(使用)一次 第一个stream流调用完毕方法,数据就会流转到下一个stream上 而这时第一个stream流已经使用完毕,就会关 ...

  8. node.js中stream流中可读流和可写流的使用

    node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...

  9. mysql系列十三、mysql中replace into和duplicate key的使用区

    一.创建测试表 1.创建唯一索引"b" CREATE TABLE `test2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `a` varch ...

  10. Stream流中的常用方法

    count package com.yang.Test.StreamStudy; import java.util.stream.Stream; /** * 统计荷属:count * 正如旧集合Col ...

随机推荐

  1. showModalBottomSheet setState 无法更新ui和高度设置问题

    showModalBottomSheet setState 无法更新ui问题 首先理解showModalBottomSheet,本质上可以理解为路由入栈,在show之后弹出的页面其实是另一个页面了,此 ...

  2. javac 无效的目标发行版: 11

    maven编译出错. JAVA_HOME 设置成了 jdk8,此时 runner 选 11 也是没用的,务必再覆盖掉 JAVA_HOME.

  3. idea中terminal的配置

    idea中terminal的配置流程: File->settings->Tools->terminal 然后根据需要进行配置: 显示git操作界面 Shell path ==> ...

  4. Qt音视频开发4-vlc读取和控制

    一.前言 vlc本身是个全功能的很牛逼的播放器,你能够想到的播放的功能他都有,比如获取视频文件的长度.唱片的封面.当前播放进度.设置播放进度.声音控制.静音控制等,这些vlc都给你封装好了,你直接调用 ...

  5. Pelco-D控制协议

    1. 通令参数: 标准速率为4800bps,无校验,  8位数据位,1位停止位 2.命令串格式: 一个PTZ控制命令为7字节的十六进制代码,格式如下: Word  1 Word2 Word 3 Wor ...

  6. 清除 TortoiseSVN已存储的连接URL地址

    Eclipse 清除 SVN 的 URL 历史记录1.关闭 Eclipse2.进入 工程目录 \.metadata\.plugins\org.tigris.subversion.subclipse.c ...

  7. COCI 2024/2025 #3

    T1 P11474 [COCI 2024/2025 #3] 公交车 / Autobus 愤怒,从红升橙足以说明其恶心,考场上调了半小时才过. 这道题的车能够开 \(24\) 小时,并且他能从前一天开到 ...

  8. 开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门

    ► 相关链接: ①MobileIMSDK-Uniapp端的详细介绍 ② MobileIMSDK-Uniapp端的开发手册new(* 精编PDF版) 一.理论知识准备 您需要对Uniapp和Vue开发有 ...

  9. C Primer Plus 第6版 第四章 编程练习参考答案

    编译环境VS Code+WSL GCC 源码请到文末下载 /*第1题*************************/ #include<stdio.h> int main() { ch ...

  10. CDS标准视图:银行对账单抬头 I_BankStatement

    视图名称:银行对账单抬头 I_BankStatement 视图类型:基础 视图代码: 点击查看代码 事务代码:FF67/ 视图结构: 字段名称 技术名称 短代码 BANKSTATEMENTSHORTI ...