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

posted @   java架构师1  阅读(946)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示