package de.invesdwin.util.math.decimal.stream; import javax.annotation.concurrent.NotThreadSafe; import de.invesdwin.util.math.decimal.ADecimal; import de.invesdwin.util.math.decimal.Decimal; @NotThreadSafe public class DecimalStreamAvg<E extends ADecimal<E>> implements IDecimalStreamAlgorithm<E, Void> { private int count = 0; private double sum = 0; private final E converter; public DecimalStreamAvg(final E converter) { this.converter = converter; } @Override public Void process(final E value) { count++; if (value != null) { sum += value.getDefaultValue().doubleValueRaw(); } return null; } public E getAvg() { final double doubleResult; if (count == 0) { doubleResult = 0D; } else { doubleResult = sum / count; } return converter.fromDefaultValue(new Decimal(doubleResult)); } public E getSum() { return converter.fromDefaultValue(new Decimal(sum)); } public int getCount() { return count; } }