Средний поток Java 8 для float
У меня есть следующая модель:
public class WeightChange {
private float value;
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
}
и коллекция:
private List<WeightChange> weightChanges;
Я реализовал функцию, которая получает среднее значение веса с использованием возможностей Java 8:
public float getAvgChangedWeight() {
return (float) weightChanges.stream().mapToDouble(WeightChange::getValue).average().getAsDouble();
}
Не могли бы вы помочь улучшить его, потому что я не думаю, что отличная двойка - хорошая идея.
Также он генерирует исключение, когда коллекция weightChanges
пуста. Как его улучшить в этом случае?
Ответы
Ответ 1
Чтобы ответить на вторую часть вашего вопроса, если вы хотите избежать исключения, когда список пуст и вернуть значение double
, используйте orElse
вместо getAsDouble
:
return weightChanges.stream()
.mapToDouble(WeightChange::getValue)
.average()
.orElse(Double.NAN);
Ответ 2
Другое решение,
/**
* Compute the average of a list of BigDecimal objects
*
* @param bigDecimalList the list which contains the BigDecimals
* @param roundingMode the RoundingMode to use.
* @return a BigDecimal with the average of the list given as argument or null if the list is empty or full of null BigDecimal numbers.
*/
public BigDecimal bigDecimalAverage(List<BigDecimal> bigDecimalList, RoundingMode roundingMode) {
// Get only the not null bigDecimals
List<BigDecimal> bigDecimals = bigDecimalList.stream().filter(Objects::nonNull).collect(Collectors.toList());
// Compute for the extreme cases
if (bigDecimals.isEmpty())
return null;
if (bigDecimals.size() == 1)
return bigDecimals.get(0);
// Compute the average
return bigDecimals.stream().reduce(ZERO, BigDecimal::add).divide(new BigDecimal(bigDecimals.size()), roundingMode);
}
Ответ 3
Ваше решение идеально. Просто добавление.orElse (значение по умолчанию)//для печати в случае, если элементы не найдены, сделает его завершенным.