我希望创建一个应用常见统计方法的简单类,使用lambda表达式。我想知道如何避免在statistic()方法中使用switch case?
例如,我可能想编写一个新的lambda来计算列表的方差等。
谢谢。
public class DescriptiveStatistics {
public static void main(String[] args) {
List<Double> numbers = Arrays.asList(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
numbers.stream().forEach(n-> System.out.print(n + " "));
System.out.println();
System.out.println("Descriptive statistics");
System.out.println("Sum: " + statistic(numbers, "Sum"));
System.out.println("Max: " + statistic(numbers, "Max"));
System.out.println("Min: " + statistic(numbers, "Min"));
System.out.println("Average: " + statistic(numbers, "Average"));
System.out.println("Count: " + statistic(numbers, "Count"));
}
private static double statistic(List<Double> numbers, String function) {
switch (function.toLowerCase()) {
case "sum":
return numbers.stream().mapToDouble(Double::doubleValue).sum();
case "max":
return numbers.stream().mapToDouble(Double::doubleValue).max().getAsDouble();
case "min":
return numbers.stream().mapToDouble(Double::doubleValue).min().getAsDouble();
case "average":
return numbers.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
case "count":
return numbers.stream().mapToDouble(Double::doubleValue).count();
}
return 0;
}
我有一个类似这样的方法:
private static double newStatistics(List<Double> numbers, Function<Double, Double> function){
return numbers.stream().mapToDouble(Double::doubleValue).function();
}
enum
(如果你提前知道所有的函数)或者 Strategy 接口(如果你需要在运行时插入新的函数)。 - chrylis -cautiouslyoptimistic-