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

相关推荐
小雨的光8 天前
JDK8中的 Stream流式编程用法优化(工具类在文章最后)
java·stream·jdk8
樱阙诗汀1 个月前
Stream流式编程工具类,开发必备
java·stream·流式编程
Klong.k1 个月前
什么是 Stream
java·stream
DN金猿2 个月前
List、Set集合通过Stream流求和
list·stream·java8
茶本无香2 个月前
Optional的stream方法,flatMap, filter应用
java·stream·filter·optional·flatmap
丁总学Java2 个月前
深入解析 Java Stream API:筛选根节点的优雅实现!!!
java·stream·collectors·lambda 表达式
丁总学Java2 个月前
深入解析 Java Stream API:从 List 到 Map 的优雅转换!!!
java·list·map·stream·方法引用·collectors·lambda 表达式
练川3 个月前
Stream特性(踩坑):惰性执行、不修改原始数据源
java·stream
会code的厨子4 个月前
Stream流简单使用
java·stream
似水流年风萧兮4 个月前
【java stream 使用案例】根据某个字段进行分组
java·stream