概述
正常hashMap中的key和value都允许为null,但是在list转map中,使用lambda表达式要求key和value都不能为null。这很反常识
起因
本身上游返回contentId和traceId 内容id和跟踪id,但是项目人员变动修改了接口没有给traceId导致
代码
public class test1 {public static void main(String[] args) {Hello hello1 = new Hello();hello1.setId(1);hello1.setValue("1");Hello hello2 = new Hello();hello2.setId(2);hello2.setValue(null);ArrayList<Hello> list = new ArrayList<>();list.add(hello1);list.add(hello2);Map<Integer, String> map = list.stream().collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));}static class Hello {int id;String value;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}
}
在merger的时候进行了判空
解决方案1 map给空设默认值或者是过滤掉
Map<Integer, String> map = list.stream().map(vo -> {if (vo.getValue() == null) {vo.setValue("default");}return vo;}).collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));Map<Integer, String> map = list.stream().filter(vo -> vo.getValue() == null).collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));HashMap<Integer, String> m5 = list.stream().collect(Collectors.toMap(vo -> vo.getId(), vo -> Optional.ofNullable(vo.getValue()).orElse("default"), (a, b) -> b, HashMap::new));
解决方案2 自己collect 定义supplier,accumulator,combiner
HashMap<Integer, String> m3 = list.stream().collect(HashMap::new, (map, item) -> map.put(item.getId(), item.getValue()), HashMap::putAll);// 上面是简写版本,下面是揉开来的版本HashMap<Integer, String> m4 = list.stream().collect(() -> {return new HashMap<Integer, String>(); // 这里定义了一个对象,相当于下面map,map1,map2的数据类型}, (map, item) -> map.put(item.getId(), item.getValue()), (map1, map2) -> {map1.putAll(map2);});
这里有supplier,accumulator,combiner
Map<Integer, String> map5 = list.stream().filter(vo -> vo.getValue() == null).collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));
这里的写法点进Collectors.toMap
进入toMap
Supplier mapFactory 相当于HashMap::new
accumulator 相当于 (map, item) -> map.put(item.getId(), item.getValue()) 也相当于 (map, item) -> map.put(item.getId(), item.getValue())
mapMerger(mergeFunction) 相当于 map1.putAll(map2); 也相当于HashMap::putAll