stream流中toMap()api和Duplicate key问题
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问题的更多相关文章
- Stream流中的常用方法_Foreach-Stream流中的常用方法_filter
Stream流中的常用方法_Foreach 流模型的操作很丰富,这里介绍一些常用的API.这些方法可以被分成两种︰·延迟方法∶返回值类型仍然是Stream,接口自身类型的方法,因此支持链式调用.(除了 ...
- JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- 【JDK8】JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- Stream流的特点_只能使用一次和Stream流中的常用方法_map
Stream流的特点_只能使用一次 public class FilterStudy04 { public static void main(String[] args) { //创建一个Stream ...
- Stream流中的常用方法foeEach和Stream流中的常用方法filter
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...
- Stream流中的常用方法_skip-Stream流中的常用方法_concat
Stream流中的常用方法_skip 如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流∶ 如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流.基本使用: Strea ...
- Stream流的特点_只能用一次-Stream流中的常用方法_map
Stream流的特点_只能用一次 Stream流属于管道流,只能被消费(使用)一次 第一个stream流调用完毕方法,数据就会流转到下一个stream上 而这时第一个stream流已经使用完毕,就会关 ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- mysql系列十三、mysql中replace into和duplicate key的使用区
一.创建测试表 1.创建唯一索引"b" CREATE TABLE `test2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `a` varch ...
- Stream流中的常用方法
count package com.yang.Test.StreamStudy; import java.util.stream.Stream; /** * 统计荷属:count * 正如旧集合Col ...
随机推荐
- WinDbg: SOSEX 下载,加载和使用帮助
SOSex 是 SOS 的扩展,由 Steve Johnson 开发,他是微软的一个员工,开发并免费提供了 SOSex for download 的下载,但该软件并不开源. 通常,该扩展不能与其他 D ...
- docker limit
我给docker的systemd
- opencv只在bin目录下编译dll,在lib目录下编译lib,在bin目录下不编译测试程序的各种exe
penCV是一个开源的计算机视觉库,它提供了多种编程语言的接口.如果你只想编译出DLL和Lib库文件,而不编译EXE(可执行文件),这通常是因为你想要进行某种形式的动态链接或者库的分发,而不关心EXE ...
- Python项目开发案例集锦pdf
下载链接:https://www.jb51.net/books/780548.html
- IM群聊消息的已读未读功能在存储空间方面的实现思路探讨
1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...
- 浅说c/c++ coroutine
浅说c/c++ coroutine 从上面我们可以得到关于协程的几个关键信息, 1.打破传统(regular)函数调用的限制. 2.stackful协程实现方式,基于独立栈,上下文切换. 3.stac ...
- w3cschool-OpenResty 最佳实践
https://www.w3cschool.cn/openresty1/ OpenResty 简介 OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了 ...
- python脚本抓取省市县区乡镇村庄(五级行政区划)
用python脚本抓取省市县区乡镇村庄(五级行政区划)的过程如下: 1,抓取国家统计局官网上的行政区划名称和对应的代码(5级是不同的网页,所以涉及多层跳转): 2,数据量大约几十万条,频繁访问考虑防屏 ...
- FailFast机制-抛出 java.util.ConcurrentModificationException(保证并发访问时集合的完整性,内部结构变化的防护措施)
- BackupBuddy pg walkthrough Intermediate
nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A 192.168.189.43 Starting Nmap 7.94SVN ( https://nmap.org ...