1

我需要使用执行一种方法创建 Callable 列表,其中每个都具有范围 [1..99) 中的 int 参数。我最初的想法是:

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 函数中,内部 lambda 无法识别为 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());

有没有办法将返回类型传递给 lambda 表达式?

4

3 回答 3

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 回答
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 double calculateResult(int value) {
    return 0.0d;
}

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

我在这里应用的更改是我显式地键入mapToObj调用,因为您希望将流映射到 a Stream<Callable<Double>>,您需要提供显式类型,这就是您的操作方式。

我仍在试图弄清楚为什么需要显式类型。

于 2014-03-28T13:15:43.787 回答