Vorrei creare una classe semplice applicando statistiche comuni usando l'espressione lambda. Mi chiedo come posso evitare di utilizzare l'interruttore caso nel metodo statistico()?Java 8 refactoring lambda expressions
Per esempio, io può decidere di scrivere un nuovo lambda per calcolare la varianza della lista, ecc
Grazie.
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;
}
che ho in mente di un metodo come questo
private static double newStatistics(List<Double> numbers, Function<Double, Double> function){
return numbers.stream().mapToDouble(Double::doubleValue).function();
}
Si deve usare sia un 'enum' (se si conosce in anticipo tutte le funzioni) o un'interfaccia di strategia (se è necessario essere in grado di inserirne di nuove in fase di runtime). – chrylis
Penso che l'interfaccia della strategia risponda alla domanda. Grazie! – CheJharia