JDK8 stream toMap方法介绍

本文介绍了JDK8中List转Map的三种toMap方法,包括基本的key-value映射,处理key冲突的策略,以及自定义Map实例的创建。重点讲解了如何通过mergeFunction和mapSupplier解决key重复问题。
摘要由CSDN通过智能技术生成

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


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重复,会有报错


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中已经出现过了,第三个参数就会定义解决的办法。

比如下面:

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。

案例


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 排序的,可以使用如下写法:


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方法解决)

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值