提问者:小点点

从IntStream对象中的mapToObj函数返回可调用的列表


我需要用execute one方法创建一个可调用列表,其中每个have int参数的范围为[1..99]。我最初的想法是:

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识别为可调用的

   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表达式?


共3个答案

匿名用户

你在找这样的东西吗?

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

匿名用户

插入强制转换,您的解决方案将编译:

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

匿名用户

您可以通过以下方式执行此操作:

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调用,因为您希望将流映射到流

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