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

net.serenitybdd.cucumber.util.BigDecimalAverageCollector Maven / Gradle / Ivy

There is a newer version: 4.2.8
Show newest version
package net.serenitybdd.cucumber.util;

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 BigDecimalAverageCollector implements Collector {

    private BigDecimalAverageCollector() {
    }

    public static BigDecimalAverageCollector create() {
        return new BigDecimalAverageCollector();
    }

    @Override
    public Supplier supplier() {
        return BigDecimalAccumulator::new;
    }

    @Override
    public BiConsumer accumulator() {
        return BigDecimalAccumulator::add;
    }

    @Override
    public BinaryOperator combiner() {
        return BigDecimalAccumulator::combine;
    }

    @Override
    public Function finisher() {
        return BigDecimalAccumulator::getAverage;
    }

    @Override
    public Set characteristics() {
        return Collections.emptySet();
    }

    static class BigDecimalAccumulator {

        public BigDecimal sum = BigDecimal.ZERO;
        public BigDecimal count = BigDecimal.ZERO;

        public BigDecimalAccumulator() {
        }


        private BigDecimalAccumulator(BigDecimal sum, BigDecimal count) {
            sum.add(sum);
            count.add(count);
        }

        public static BigDecimalAccumulator accumulateWith(BigDecimal sum, BigDecimal count) {
            return new BigDecimalAccumulator(sum, count);
        }

        BigDecimal getAverage() {
            return BigDecimal.ZERO.compareTo(count) == 0 ?
                   BigDecimal.ZERO :
                   sum.divide(count, 2, BigDecimal.ROUND_HALF_UP);
        }

        BigDecimalAccumulator combine(BigDecimalAccumulator another) {
            return accumulateWith(
                sum.add(another.sum),
                count.add(another.count)
            );
        }

        void add(BigDecimal successRate) {
            count = count.add(BigDecimal.ONE);
            sum = sum.add(successRate);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy