• Collectors扩展接口 实现BigDecimal的相加


    Collectors扩展接口 实现BigDecimal的相加

    第一步创建 ToBigDecimalFunction接口

    
    import java.math.BigDecimal;
    
    @FunctionalInterface
    public interface ToBigDecimalFunction<T> {
        BigDecimal applyAsBigDecimal(T value);
    }
    
    

    第二步 创建工具类 实现接口

    
    
    import java.math.BigDecimal;
    import java.util.Collections;
    import java.util.Set;
    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;
    
    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);
        }
    
    }
    
    

    使用测试

    import com.example.javademo.JavaDemoApplicationTests;
    import com.example.javademo.pojo.Student;
    import com.example.javademo.utils.DataUtils;
    import org.junit.Test;
    import java.math.BigDecimal;
    import java.util.stream.Collectors;
    
    
    public class TestBigDecimal extends JavaDemoApplicationTests {
    
        @Test
        public void testGroupByAfterBigdecimal(){
            /*
            自定义实现对分组后的集合,属性为bigdecmal进行相加
             */
            System.out.println(DataUtils.getData().stream().collect(Collectors.groupingBy(Student::getSchool,CollectorsUtil.summingBigDecimal(Student::getMoney))));
            //归约造作
            BigDecimal reduce = DataUtils.getData().stream().map(Student::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
            System.out.println(reduce);
            int sum = DataUtils.getData().stream().mapToInt(Student::getAge).sum();
            System.out.println(sum);
        }
    }
    
    
  • 相关阅读:
    使用内部单向链表实现的一个简单堆栈
    通过反射调用内部类的隐藏方法
    动态代理生成空对象
    通过使用java.lang.reflect.Proxy实现动态代理
    简单代理模式
    暗色CSS,适用与Stylish, IE, FF, OPERA等.
    CWnd派生的控件处理MouseMove, MouseHover, MouseLeave
    _tcscpy_s的size应至少为src的长度+1(要把计算在内)
    用INET(CHttpFile)下载有重定向链接时获取最终URL的方法.
    GetDlgItem以及其他获得CWnd相关的函数要注意。。
  • 原文地址:https://www.cnblogs.com/java-hardly-road/p/11102690.html
Copyright © 2020-2023  润新知