jones's technical blog

  • 首页
  • 文章归档
  • 默认分类
  • 关于页面

  • 搜索
博客系统 linux 酸酸乳

对数据进行分组, 求和

发表于 2020-05-06 | 分类于 jdk8 新特性 | 0 | 阅读次数 151

本篇博客参考自 Java8中Collectors求和功能的自定义扩展

上午要实现个需求, 对数据按照id分组, 并且求和, sql 用 group by 报错, 最后在逻辑里面实现, 用了lambda表达式 和 stream 流来处理.

@org.junit.Test
    public void test2() {
        BriefcharpterQuery query = new BriefcharpterQuery();
        List<HrBriefchapter> list = hrBriefchapterMapper.queryBriefcharpterDtoByParams(query);
        list.stream().map(
                c -> {
                    //rebat是对象, 所以对rebat进行stream处理
                    Map<Integer, BigDecimal> collect = c.getRebat().stream()
                            //分组 再求和 groupingBy是分组操作 summingBigDecimal是对 stream 的自定义扩展
                       .collect(Collectors.groupingBy(HrRebaterecord::getBriefchapterId,
                            CollectorsUtil.summingBigDecimal(HrRebaterecord::getRebateOne)));
                    System.out.println(collect);
                    
                    //foreach 遍历集合
                    collect.forEach((k, v) -> {
                        c.getRebat().stream().map(val -> {
                            //把遍历完的值set 到 对象里面
                            val.setRebateOne(v);
                            return v;
                        }).collect(Collectors.toList());
                    });
                    return c;
                }).collect(Collectors.toList());

    }

对stream 扩展类:

@FunctionalInterface
public interface ToBigDecimalFunction<T> {
    BigDecimal applyAsBigDecimal(T value);
public class CollectorsUtil {
    static final Set<Collector.Characteristics> CH_NOID = Collections.emptySet();

    private CollectorsUtil() {
    }

    @SuppressWarnings("unchecked")
    private static <I, R> Function<I, R> castingIdentity() {
        return i -> (R) i;
    }

    /**
     * Simple implementation class for {@code Collector}.
     *
     * @param <T>
     *            the type of elements to be collected
     * @param <R>
     *            the type of the result
     */
    static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
        private final Supplier<A> supplier;
        private final BiConsumer<A, T> accumulator;
        private final BinaryOperator<A> combiner;
        private final Function<A, R> finisher;
        private final Set<Characteristics> characteristics;

        CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
                      Function<A, R> finisher, Set<Characteristics> characteristics) {
            this.supplier = supplier;
            this.accumulator = accumulator;
            this.combiner = combiner;
            this.finisher = finisher;
            this.characteristics = characteristics;
        }

        CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
                      Set<Characteristics> characteristics) {
            this(supplier, accumulator, combiner, castingIdentity(), characteristics);
        }

        @Override
        public BiConsumer<A, T> accumulator() {
            return accumulator;
        }

        @Override
        public Supplier<A> supplier() {
            return supplier;
        }

        @Override
        public BinaryOperator<A> combiner() {
            return combiner;
        }

        @Override
        public Function<A, R> finisher() {
            return finisher;
        }

        @Override
        public Set<Characteristics> characteristics() {
            return characteristics;
        }
    }

    public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(ToBigDecimalFunction<? super T> mapper) {
        return new CollectorImpl<>(() -> new BigDecimal[1], (a, t) -> {
            if (a[0] == null) {
                a[0] = BigDecimal.ZERO;
            }
            a[0] = a[0].add(mapper.applyAsBigDecimal(t));
        }, (a, b) -> {
            a[0] = a[0].add(b[0]);
            return a;
        }, a -> a[0], CH_NOID);
    }


}
jones wechat
更多精彩内容请关注微信公众号
  • 本文作者: jones
  • 本文链接: https://www.lushuaiyu.com/archives/对数据进行分组求和
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 博客系统 # linux # 酸酸乳
当谈论面向对象的时候,我们在谈论什么
封装、抽象、继承、多态分别可以解决哪些编程问题
  • 文章目录
  • 站点概览
jones

jones

程序猿

46 日志
16 分类
3 标签
Github E-mail
Creative Commons
0%
© 2021 jones
主题 - NexT.Pisces