JDK8 stream toMap方法介绍

JDK8 List转Map方法,有下3种方法。

java 复制代码
toMap(keyMapper, valueMapper);
toMap(keyMapper, valueMapper, BinaryOperator<U> mergeFunction);
toMap(keyMapper, valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);

keyMapper:Key的映射函数

valueMapper:Value的映射函数

mergeFunction:当Key冲突时,调用的合并方法,对value进行处理。

mapSupplier:Map 构造器,在需要返回特定的Map时使用

第一个toMap方法

第一个toMap()方法返回Map,自然会需要key和value,所以2个参数是用来生成key和value的,下面案例如果key重复,会有报错

java 复制代码
userList.stream().collect(Collectors.toMap(User::getId, t -> t));
userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

第二个toMap方法

第二个toMap()方法的第一个参数就是用来生成key值的,第二个参数就是用来生成value值的。第三个参数用在key值冲突的情况下:如果新元素产生的key在Map中已经出现过了,第三个参数就会定义解决的办法。

比如下面:

java 复制代码
collect(Collectors.toMap(UserBo::getUserId, v -> v, (v1, v2) -> v1));

第一个参数UserBo::getUserId 表示选择UserBo的getUserId作为map的key值;

第二个参数v -> v表示选择将原来的对象作为map的value值;

第三个参数(v1, v2) -> v1中,如果v1与v2的key值相同,选择v1作为那个key所对应的value值,注意是key所对应的value。

案例

java 复制代码
List<String> strings = Arrays.asList("a", "b", "c", "a", "b");
// 使用toMap时,通过BinaryOperator函数处理重复键,注意BinaryOperator函数的2个参数是这个key对应的value
Map<String, Integer> map = strings.stream().collect(
		Collectors.toMap(
			str -> str,
			str -> 1,
			(existingValue, newValue) -> existingValue + newValue));
			
//map  {a=2, b=2, c=1}

第三个toMap方法

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

java 复制代码
userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1, TreeMap::new));
userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1, LinkedHashMap::new));

注意事项

1、Map中的value不能为null

2、Map中的key不能重复(可以通过第二个toMap或者第三个toMap方法解决)

相关推荐
10km4 天前
java: HashMap.merge 的 Null 值陷阱:为什么 Stream API 会抛出 NPE
java·stream·hashmap·merge
云雾J视界15 天前
多Stream并发实战:用流水线技术将AIGC服务P99延迟压降63%
aigc·api·cpu·stream·gpu·cuda·多并发
颜颜yan_18 天前
基于CANN多Stream异步执行的智能推理管道:突破传统串行瓶颈
运维·架构·stream·昇腾·cann
彩虹、1 个月前
数据处理常用到的一些Java 8中Stream操作
stream·java 8
程序员三明治1 个月前
选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
java·redis·后端·缓存·rocketmq·stream·队列
花伤情犹在2 个月前
Java Stream 高级应用:优雅地扁平化(FlatMap)递归树形结构数据
java·stream·function·flatmap
sg_knight2 个月前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
DN金猿2 个月前
java8提取list中对象有相同属性值的对象或属性值
java·list·stream·java8
mask哥3 个月前
详解flink性能优化
java·大数据·微服务·性能优化·flink·kafka·stream
中草药z3 个月前
【Stream API】高效简化集合处理
java·前端·javascript·stream·parallelstream·并行流