5

ラムダ式を使用して一般的な統計を適用する単純なクラスを作成したいと思います。statistic() メソッドで switch ケースを使用しないようにするにはどうすればよいでしょうか?

たとえば、リストの分散などを計算するために新しいラムダを書きたいと思うかもしれません。

ありがとうございました。

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();
    }
4

2 に答える 2

8

メソッド統計Stringパラメータを、DoubleStreamを受け取って集計を返す関数型に置き換えます。

private static double statistic(List<Double> numbers,
                                ToDoubleFunction<DoubleStream> function) {
    return function.applyAsDouble(
        numbers.stream().mapToDouble(Double::doubleValue));
}

これで、ストリームのさまざまな操作にswitchステートメントを使用せずに、次のようにメソッドを呼び出すことができます。

System.out.println("Sum: " + statistic(numbers, s -> s.sum()));
System.out.println("Max: " + statistic(numbers, s -> s.max().getAsDouble()));
System.out.println("Min: " + statistic(numbers, s -> s.min().getAsDouble()));
System.out.println("Average: " + statistic(numbers, s -> s.average().getAsDouble()));
System.out.println("Count: " + statistic(numbers, s -> s.count()));
于 2014-04-05T13:19:53.020 に答える