我需要用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表达式?
你在找这样的东西吗?
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调用,因为您希望将流映射到流
我仍在试图弄清楚为什么需要显式类型。