Tôi muốn tạo một lớp đơn giản áp dụng các số liệu thống kê phổ biến bằng cách sử dụng biểu thức lambda. Tôi tự hỏi làm thế nào tôi có thể tránh sử dụng trường hợp chuyển đổi trong phương thức thống kê()?Java 8 tái cấu trúc các biểu thức lambda
Ví dụ: tôi có thể muốn viết một lambda mới để tính toán phương sai của danh sách, v.v.
Cảm ơn bạn.
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;
}
tôi có trong tâm trí của một phương pháp như thế này
private static double newStatistics(List<Double> numbers, Function<Double, Double> function){
return numbers.stream().mapToDouble(Double::doubleValue).function();
}
Bạn nên sử dụng hoặc là một 'enum' (nếu bạn biết trước thời hạn tất cả các chức năng) hoặc một giao diện Chiến lược (nếu bạn cần để có thể cắm những cái mới trong thời gian chạy). – chrylis
Tôi nghĩ giao diện Chiến lược trả lời câu hỏi. Cảm ơn bạn! – CheJharia