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)
取决于您喜欢哪种风格。
可选双重平均()
其中,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)
它在语法上得到简化
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |