1

それぞれが範囲 [1..99) からの int パラメータを持ち、1 つのメソッドを実行する Callable のリストを作成する必要があります。私の最初のアイデアは次のとおりです。

List<Callable<Double>> list = new ArrayList<>(100);
IntStream.range(1, 99).forEach(i -> list.add(() -> calculateResult(i)));

次のアイデアは、リストする項目を収集することでした。

List<Callable<Double>> list = IntStream.range(1, 99).mapToObj(value -> (() -> calculateResult(value))).collect(Collectors.toList());

良さそうに見えますが、mapToObj 関数では内部ラムダが Callable<Double> として認識されません。このような典型的な内部クラスを使用すると、機能します。

   List<Callable<Double>> list = IntStream.range(1, 99).mapToObj(new IntFunction<Callable<Double>>() {
        @Override
        public Callable<Double> apply(int value) {
            return () -> calculateResult(value);
        }
    }).collect(Collectors.toList());

戻り値の型をラムダ式に渡す方法はありますか?

4

3 に答える 3

1

キャストを挿入すると、ソリューションがコンパイルされます。

List<Callable<Double>> list = IntStream.range(1, 99)
    .mapToObj(value -> (Callable<Double>) (() -> calculateResult(value)))
    .collect(Collectors.toList());
于 2014-03-28T12:36:05.550 に答える
1

このようなものをお探しですか?

public static void main(String[] args) {
    List<Callable<Double>> list = IntStream.range(1, 99)
            .<Callable<Double>>mapToObj(value -> callableFactory(value))
            .collect(Collectors.toList());
}

public static Callable<Double> callableFactory(int value) {
    return new Callable<Double>() {
        @Override public Double call() { return calculateResult(value); }
    };
}

public static Double calculateResult(int value) {
    return Math.random();
}
于 2014-03-28T12:17:59.767 に答える