c语言编程笔录

首页 >   > 笔记大全

笔记大全

使用stream的CollectorstoMap方法常见问题如何解决

更新时间:2023-11-30

问题描述:

在Java 8中,使用Collectors.toMap()方法常常出现一些问题,例如:

1. 如果Map中存在相同的键,则会抛出IllegalStateException异常。

2. 如果值为null,则会抛出NullPointerException异常。

问题分析:

Collections.toMap()方法的作用是把Stream中的元素收集到Map中。它有三个参数:

toMap(Function<? super T, ? extends K> keyMapper,
      Function<? super T, ? extends U> valueMapper,
      BinaryOperator mergeFunction)

其中,keyMapper将原Stream中的元素映射成Map中的键,valueMapper将原Stream中的元素映射成Map中的值。如果存在相同的键,mergeFunction就会被调用,将两个值合并为一个。如果mergeFunction为null,则会抛出IllegalStateException。如果keyMapper返回null或valueMapper返回null,则会抛出NullPointerException。

问题解决:

解决冲突问题:

第一个问题的解决方法是在toMap方法的第三个参数mergeFunction中指定如何合并两个相同的键的值。例如,以下代码使用String的concat()方法将两个值合并。

List list = Arrays.asList("A", "B", "C", "A");
Map map = list.stream().collect(Collectors.toMap(Function.identity(), Function.identity(), String::concat));
System.out.println(map);//{A=AA, B=B, C=C}

解决空指针问题:

如果stream中存在为null的值,可以使用Optional类来解决。例如,以下代码使用Optional.ofNullable()方法将null值转换成空字符串。

List list = Arrays.asList("A", null, "B", null);
Map map = list.stream().collect(Collectors.toMap(Function.identity(), v -> Optional.ofNullable(v).orElse("")));
System.out.println(map);//{A=A, B=B, }        

  • 个人微信

    工作时间

    周一至周日 9:00-21:00