我写了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;
}
长期一样...
答案 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)