list对象转map
在使用 java.util.stream.Collectors 类的 toMap() 方法转为 Map 集合时,一定要使用参数类型 为 BinaryOperator,参数名为 mergeFunction 的方法,否则当出现相同 key 时会抛出 IllegalStateException 异常。
说明:参数 mergeFunction 的作用是当出现 key 重复时,自定义对 value 的处理策略。
正例:
List<Pair<String, Double>> pairArrayList = new ArrayList<>(3); pairArrayList.add(new Pair<>("version", 12.10)); pairArrayList.add(new Pair<>("version", 12.19)); pairArrayList.add(new Pair<>("version", 6.28)); // 生成的 map 集合中只有一个键值对:{version=6.28} Map<String, Double> map = pairArrayList.stream() .collect(Collectors.toMap(Pair::getKey, Pair::getValue, (v1, v2) -> v2)); System.out.println(map);//{version=6.28}
反例:
String[] departments = new String[]{"aaa", "aaa", "bbb"}; // 抛出 IllegalStateException 异常 Map<Integer, String> map = Arrays.stream(departments) .collect(Collectors.toMap(String::hashCode, str -> str)); System.out.println(map); Map<Integer, String> map2 = Arrays.stream(departments) .collect(Collectors.toMap(String::hashCode, str -> str, (v1, v2) -> v2)); System.out.println(map2);//{96321=aaa, 97314=bbb}
在使用 java.util.stream.Collectors 类的 toMap() 方法转为 Map 集合时,一定要注意当 value 为 null 时会抛 NPE 异常。
说明:在 java.util.HashMap 的 merge 方法里会进行如下的判断:
if (value == null || remappingFunction == null) throw new NullPointerException();
反例:
List<Pair<String, Double>> pairArrayList = new ArrayList<>(2); pairArrayList.add(new Pair<>("version", 12.10)); pairArrayList.add(new Pair<>("version", null)); // 抛出 NullPointerException 异常 Map<String, Double> map = pairArrayList.stream() .collect(Collectors.toMap(Pair::getKey, Pair::getValue, (v1, v2) -> v2)); System.out.println(map);
附:
@Data public class Pair<T,P> { public Pair(T key, P value) { this.key = key; this.value = value; } T key; P value; }
来源: Java开发手册1.7.1 - (六) 集合处理 - 3