I'm wanting to take the following method:
public BigDecimal mean(List<BigDecimal> bigDecimals, RoundingMode roundingMode) { BigDecimal sum = BigDecimal.ZERO; int count=0; for(BigDecimal bigDecimal : bigDecimals) { if(null != bigDecimal) { sum = sum.add(bigDecimal); count++; } } return sum.divide(new BigDecimal(count), roundingMode); }
and update it using the Streams api. Here's what I've got thus far:
public BigDecimal average(List<BigDecimal> bigDecimals, RoundingMode roundingMode) { BigDecimal sum = bigDecimals.stream() .map(Objects::requireNonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); long count = bigDecimals.stream().filter(Objects::nonNull).count(); return sum.divide(new BigDecimal(count), roundingMode); }
Is there a way to do this without streaming twice (the second time to get the count)?
math. BigDecimal. equals() method checks for equality of a BigDecimal value with the object passed. This method considers two BigDecimal objects equal if only if they are equal in value and scale.
compareTo(BigDecimal val) compares the BigDecimal Object with the specified BigDecimal value. Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method.
math. BigDecimal. add(BigDecimal val) is used to calculate the Arithmetic sum of two BigDecimals. This method is used to find arithmetic addition of large numbers of range much greater than the range of largest data type double of Java without compromising with the precision of the result.
BigDecimal[] totalWithCount = bigDecimals.stream() .filter(bd -> bd != null) .map(bd -> new BigDecimal[]{bd, BigDecimal.ONE}) .reduce((a, b) -> new BigDecimal[]{a[0].add(b[0]), a[1].add(BigDecimal.ONE)}) .get(); BigDecimal mean = totalWithCount[0].divide(totalWithCount[1], roundingMode);
Optional text description of the code for those that are find that to be helpful (Ignore if you find the code sufficiently self explanatory.):
a
of (a,b)
value has the partial sum in the first element and the partial count in the second element. The first element of the b
element contains each of the BigDecimal values to add to the sum. The second element of b
is not used.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With