如何编写一个接受 Integer、Float、Double 列表并计算平均值的方法?

Kee*_*thi 7 java generics collections java-stream

我正在尝试编写一个方法,该方法接受数值列表 - 例如List<Integer>List<Float>List<Double>- 并给出平均值。

public double getAverage(List<? extends Number> stats) {
    double sum = 0.00;
    if(!stats.isEmpty()) {
        // sum = stats.stream()
        //            .reduce(0, (a, b) -> a + b);
        // return sum / stats.size();
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我得到的错误:

运算符“+”不能应用于“capture<?” 扩展 java.lang.Number>', 'capture<? 扩展 java.lang.Number>'

Boh*_*ian 10

通过 对象DoubleStream创建,然后使用可用的归约方法计算平均值:NumberNumber#doubleValue()

public double getAverage(List<? extends Number> stats) {
    return stats.stream()
      .mapToDouble(Number::doubleValue)
      .summaryStatistics() // small overhead of unnecessary arithmetic
      .getAverage(); // returns 0 when empty
}
Run Code Online (Sandbox Code Playgroud)

或者

public double getAverage(List<? extends Number> stats) {
    return stats.stream()
      .mapToDouble(Number::doubleValue)
      .average()
      .orElse(0); // explicit value for empty (but no other value makes sense)
}
Run Code Online (Sandbox Code Playgroud)

取决于您喜欢哪种风格。

  • `.average() .orElse(0)` 更好,因为它不会浪费资源来计算最小值和最大值,而只是在之后删除信息。此外,它还明确说明了空列表会发生什么。 (8认同)

Sib*_*med 2

可选双重平均()

其中,OptionalDouble 是一个容器对象,可能包含也可能不包含 double 值。

  public class Test {

    public static OptionalDouble getAverage(List<? extends Number> stats) {
        return stats.
                stream().
                 mapToDouble(d -> d.doubleValue()).
                    average();
            
    }
    
    public static void main(String[] args) throws IOException {

        List<Integer> list = Arrays.asList(1, 4, 5, 67, 3);
        if(getAverage(list).isPresent());
        {
            Double average = getAverage(list).getAsDouble();
            System.out.println(average);
        }
        
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

使用谷歌番石榴

 Double averge = Stats.meanOf(list);

      
Run Code Online (Sandbox Code Playgroud)

它在语法上得到简化