All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.agzamovr.collectors.SummingBigDecimalCollector Maven / Gradle / Ivy

The newest version!
package org.agzamovr.collectors;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

import static java.util.Comparator.nullsLast;
import static java.util.stream.Collectors.toList;

class SummingBigDecimalCollector {
    static final SummingBigDecimalCollector SUMMING_BIG_DECIMAL_COLLECTOR = new SummingBigDecimalCollector();

    private void validateInput(Function mapper,
                               Comparator comparator,
                               Collector downstream) {
        Objects.requireNonNull(mapper, "Mapper cannot be null");
        Objects.requireNonNull(comparator, "Comparator cannot be null");
        Objects.requireNonNull(downstream, "Downstream collector cannot be null");
    }

     R summingBigDecimalFinisher(Function mapper,
                                          Comparator comparator,
                                          List list,
                                          Collector downstream) {
        validateInput(mapper, comparator, downstream);
        list.sort(comparator);
        BigDecimal sum = BigDecimal.ZERO;
        Supplier downstreamSupplier = downstream.supplier();
        Function finisher = downstream.finisher();
        BiConsumer downstreamAccumulator = downstream.accumulator();
        A container = downstreamSupplier.get();
        for (T item : list) {
            sum = sum.add(mapper.apply(item));
            downstreamAccumulator.accept(container, sum);
        }
        return finisher.apply(container);
    }

    >
    Collector> summingBigDecimal(Function mapper) {
        return summingBigDecimal(mapper, nullsLast(Comparator.naturalOrder()));
    }

    , R>
    Collector summingBigDecimal(Function mapper,
                                         Collector downstream) {
        return summingBigDecimal(mapper, nullsLast(Comparator.naturalOrder()), downstream);
    }

    
    Collector> summingBigDecimal(Function mapper,
                                                        Comparator comparator) {
        return summingBigDecimal(mapper, comparator, toList());
    }

    
    Collector, R> summingBigDecimal(Function mapper,
                                               Comparator comparator,
                                               Collector downstream) {
        return Collector.of(ArrayList::new,
                List::add,
                CollectorEx::listCombiner,
                (list) -> summingBigDecimalFinisher(mapper, comparator, list, downstream));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy