Средний поток 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 (значение по умолчанию)//для печати в случае, если элементы не найдены, сделает его завершенным.