栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8 List对象中 BigDecimal类型求和

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8 List对象中 BigDecimal类型求和

        List集合中的某个对象值是BigDecimal类型的,且需要对所有对象中相同的BigDecimal类型的属性进行求和,找不到现成的工具类可以使用,可以自己来定义一个。

1.定义工具类

package com.kakarote.core.utils;

import lombok.Data;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Collectors;


public class CollectorsUtils {

    private static final Set CHARACTERISTICS = Collections.emptySet();

    private CollectorsUtils() {
    }

    @SuppressWarnings("unchecked")
    private static  Function check() {
        return i -> (R) i;
    }

    @SuppressWarnings("hiding")
    static class CollectorImpl implements Collector {

        private final Supplier supplier;
        private final BiConsumer accumulator;
        private final BinaryOperator combiner;
        private final Function finisher;
        private final Set characteristics;

        CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, Function finisher, Set characteristics) {
            this.supplier = supplier;
            this.accumulator = accumulator;
            this.combiner = combiner;
            this.finisher = finisher;
            this.characteristics = characteristics;
        }

        CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, Set characteristics) {
            this(supplier, accumulator, combiner, check(), characteristics);
        }

        @Override
        public Supplier supplier() {
            return supplier;
        }

        @Override
        public BiConsumer accumulator() {
            return accumulator;
        }

        @Override
        public BinaryOperator combiner() {
            return combiner;
        }

        @Override
        public Function finisher() {
            return finisher;
        }

        @Override
        public Set characteristics() {
            return characteristics;
        }
    }

    
    public static  Collector summingBigDecimal(ToBigDecimalFunction mapper) {
        return new CollectorImpl<>(
                () -> new BigDecimal[]{new BigDecimal(0)},
                (a, t) -> {
                    a[0] = a[0].add(mapper.applyAsBigDecimal(t), MathContext.DECIMAL32);
                },
                (a, b) -> {
                    a[0] = a[0].add(b[0], MathContext.DECIMAL32);
                    return a;
                },
                a -> a[0], CHARACTERISTICS
        );
    }

    
    public static  Collector maxBy(ToBigDecimalFunction mapper) {
        return new CollectorImpl<>(
                () -> new BigDecimal[]{new BigDecimal(Integer.MIN_VALUE)},
                (a, t) -> {
                    a[0] = a[0].max(mapper.applyAsBigDecimal(t));
                },
                (a, b) -> {
                    a[0] = a[0].max(b[0]);
                    return a;
                },
                a -> a[0], CHARACTERISTICS
        );
    }

    
    public static  Collector minBy(ToBigDecimalFunction mapper) {
        return new CollectorImpl<>(
                () -> new BigDecimal[]{new BigDecimal(Integer.MAX_VALUE)},
                (a, t) -> {
                    a[0] = a[0].min(mapper.applyAsBigDecimal(t));
                },
                (a, b) -> {
                    a[0] = a[0].min(b[0]);
                    return a;
                },
                a -> a[0], CHARACTERISTICS
        );
    }

    
    public static  Collector averagingBigDecimal(ToBigDecimalFunction mapper,
                                                                      int newScale, int roundingMode) {
        return new CollectorImpl<>(
                () -> new BigDecimal[]{new BigDecimal(0), new BigDecimal(0)},
                (a, t) -> {
                    a[0] = a[0].add(mapper.applyAsBigDecimal(t));
                    a[1] = a[1].add(BigDecimal.ONE);
                },
                (a, b) -> {
                    a[0] = a[0].min(b[0]);
                    return a;
                },
                a -> a[0].divide(a[1], MathContext.DECIMAL32).setScale(newScale, roundingMode), CHARACTERISTICS
        );
    }

    // 自定义函数
    @FunctionalInterface
    interface ToBigDecimalFunction {

        BigDecimal applyAsBigDecimal(T t);

    }

}

2.定义实体类

    @Data
    @Accessors(chain = true) // 开启链式编程
    static class People{
        Long id;
        Integer sex;
        BigDecimal money;
    }

3.测试

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new People().setId(1l).setSex(1).setMoney(BigDecimal.ONE));
        list.add(new People().setId(2l).setSex(1).setMoney(BigDecimal.TEN));
        list.add(new People().setId(3l).setSex(0).setMoney(BigDecimal.ZERO));
        list.add(new People().setId(4l).setSex(0).setMoney(BigDecimal.TEN));
        list.add(new People().setId(5l).setSex(1).setMoney(BigDecimal.valueOf(5)));
        BigDecimal sum = list.stream().collect(CollectorsUtils.summingBigDecimal(People::getMoney));
        System.out.println("求和:" + sum);
        Map collect = list.stream().collect(Collectors.groupingBy(People::getSex, CollectorsUtils.summingBigDecimal(People::getMoney)));
        System.out.println("分组求和:" + collect);
    }

4.结果

求和:26
分组求和:{0=10, 1=16}

java8listBigDecimal求和

java8lamdba表达式list集合的BigDecimal求和操作

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/837294.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号