Ich möchte eine einfache Klasse erstellen, die gemeinsame Statistiken mit Lambda-Ausdruck anwenden. Ich frage mich, wie kann ich vermeiden, den Schalter Fall in der Methode statistic() verwenden?Java 8 Refactoring Lambda-Ausdrücke
Zum Beispiel kann ich möchte eine neue Lambda schreiben, um die Varianz der Liste zu berechnen usw.
Danke.
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;
}
Ich denke dabei an ein Verfahren wie dieses
private static double newStatistics(List<Double> numbers, Function<Double, Double> function){
return numbers.stream().mapToDouble(Double::doubleValue).function();
}
Sie entweder eine 'enum' verwenden sollten (wenn Sie im Voraus wissen, alle Funktionen) oder eine Strategy-Oberfläche (wenn Sie zur Laufzeit neue hinzufügen müssen). – chrylis
Ich denke, dass die Strategie-Schnittstelle die Frage beantwortet. Vielen Dank! – CheJharia