前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对null值友好的Collectors.groupingBy

对null值友好的Collectors.groupingBy

作者头像
阿超
发布2022-08-21 11:10:37
8070
发布2022-08-21 11:10:37
举报
文章被收录于专栏:快乐阿超快乐阿超

我们在使用Collectors.groupingBy时会遇到这种情况:

代码语言:javascript
复制
Map<String, List<User>> map = Arrays.asList(new User(), null).stream().collect(Collectors.groupingBy(User::getName));
image-20220109213438674
image-20220109213438674

为了避免这种情况,于是我自己实现了一个:

代码语言:javascript
复制
@SafeVarargs
@SuppressWarnings("unchecked")
public static <T, K, D, A, M extends Map<K, D>> M listGroupBy(List<T> list, Function<T, K> sFunction, Collector<? super T, A, D> downstream, boolean isParallel, Consumer<T>... peeks) {
    boolean hasFinished = downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH);
    return peekStream(list, isParallel, peeks).collect(new Collector<T, HashMap<K, A>, M>() {
        @Override
        public Supplier<HashMap<K, A>> supplier() {
            return HashMap::new;
        }

        @Override
        public BiConsumer<HashMap<K, A>, T> accumulator() {
            return (m, t) -> {
                K key = Optional.ofNullable(t).map(sFunction).orElse(null);
                A container = m.computeIfAbsent(key, k -> downstream.supplier().get());
                downstream.accumulator().accept(container, t);
            };
        }

        @Override
        public BinaryOperator<HashMap<K, A>> combiner() {
            return (m1, m2) -> {
                for (Map.Entry<K, A> e : m2.entrySet()) {
                    m1.merge(e.getKey(), e.getValue(), downstream.combiner());
                }
                return m1;
            };
        }

        @Override
        public Function<HashMap<K, A>, M> finisher() {
            return hasFinished ? i -> (M) i : intermediate -> {
                // a-> a[0]
                intermediate.replaceAll((k, v) -> (A) downstream.finisher().apply(v));
                @SuppressWarnings("unchecked")
                M castResult = (M) intermediate;
                return castResult;
            };
        }

        @Override
        public Set<Characteristics> characteristics() {
            return hasFinished ? Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)) : Collections.emptySet();
        }
    });
}

使用方式:

代码语言:javascript
复制
Map<String, List<User>> map = listGroupBy(Arrays.asList(new User(), null), User::getName, Collectors.toList(), false)

这样避免了抛出异常,返回了对null值友好的结果(map里包含一个keynull的结果)

我稍作修改放到MPSimpleQueryhutool中的CollStreamUtil以及CollectorUtil中去了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档