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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下