合并从<!-?类型获取列表的方法扩展数字->

时间:2018-08-16 09:43:23

标签: java generics

我写了4种方法来计算列表的平均值。 我可以以任何方式合并这些方法吗?我想有一个类似

的方法
private double getAverage(@NotNull List<? extends Number> list) {
    //magic code from stackoverflow
}

目前这是我所做的:

    private double getAverageDouble(@NotNull List<Double> list) {
    double result = 0;

    for (Double value : list) {
        result += value / (double)list.size();
    }
    return result;
}



private double getAverageFloat(@NotNull List<Float> list) {
    double result = 0;

    for (Float value : list) {
        result += value / (double)list.size();
    }
    return result;
}




private double getAverageInteger(@NotNull List<Integer> list) {
    double result = 0;

    for (Integer value : list) {
        result += value / (double)list.size();
    }
    return result;
}

长期一样...

2 个答案:

答案 0 :(得分:2)

使用Number的{​​{3}}方法。

public static double average(List<? extends Number> list) {
  double sum = 0.0;
  for (Number number : list) {
    sum += number.doubleValue();
  }
  return sum / list.size();
}

您还可以使用doubleValue()简化此操作。

public static double average(List<? extends Number> list) {
  return list.stream().mapToDouble(Number::doubleValue).average().orElse(0.0);
}

答案 1 :(得分:1)

Number给出doubleValue(),您可以在计算中使用它:

private <T extends Number> double getAverage(@NotNull List<T> list) {
    double result = 0;

    for (Number value : list) {
        result += value.doubleValue() / list.size();
    }

    return result;
}

该方法可以用List<Integer>List<Float>List<Double>等调用。

但是请注意,实现可以像(java8 +)一样简单:

return list.stream()
    .mapToDouble(Number::doubleValue)
    .average()
    .orElse(0)