java8 Collectors.toMap value 不能为nulll
java8 Collectors.toMap value 不能为nulll
private static void convert(Class<?> aClass, List<Field> fields, List<Map<String, Object>> list, Object obj) { if (aClass != obj.getClass()) { throw new RuntimeException(String.format("参数异常%s不能转换为%s", obj.getClass(), aClass)); } Map<String, Object> map = fields.stream().collect(Collectors.toMap(keyMapper, declaredField -> { declaredField.setAccessible(true); try {return declaredField.get(obj); } catch (IllegalAccessException e) { throw new RuntimeException(e); } })); list.add(map); }
解决方案
因此Collectors.toMap 方法是无法解决value为null 抛出异常的,但我们实现list转map的需求还是存在的,那么对于这类需求,可以选择另一种方式实现,就是用Collectors.groupingBy。
实现方案 1
默认的Collectors.groupingBy 返回的是Map<Key,List<Value>> 形式的结果,但我们需要返回的Map<Key,Value>形式的结果。因此需要对需要做额外的一些处理。
private static void convert(Class<?> aClass, List<Field> fields, List<Map<String, Object>> list, Object obj) { if (aClass != obj.getClass()) { throw new RuntimeException(String.format("参数异常%s不能转换为%s", obj.getClass(), aClass)); } Map<String, Object> map = fields.stream().collect(Collectors.groupingBy(keyMapper, HashMap::new,Collectors.reducing(null,declaredField -> { declaredField.setAccessible(true); try {return declaredField.get(obj); } catch (IllegalAccessException e) { throw new RuntimeException(e); } },(v1,v2)->v2))); list.add(map); }
原理就是利用额外的Collectors.reducing来做收集处理,将最终的List<Value> 转换成 Value。
实现方案 2
学到另一种方案,调用Stream的另一个collect方法
<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);
public void test_toMap4(){ List<Data> dataList = List.of( new Data(1,"A"), new Data(2,"B"), new Data(3,"C"), new Data(4,null), new Data(5,null) ); Map<Integer,String> dataMap = dataList.stream() .collect(HashMap::new,(map,item)->map.put(item.key,item.value),(map1,map2)->map1.putAll(map2) ); }
当然(map1,map2)->map1.putAll(map2) 也可以简化成HashMap::putAll

浙公网安备 33010602011771号