Java 在ArrayList中存储Future

Java 在ArrayList中存储Future,java,arraylist,callable,Java,Arraylist,Callable,如果你有 ArrayList<Future<Double>>calculations = new ArrayList(); 或者任何将来的对象,在这种情况下,当callable完成运行时,它会自动从未来值转换为所需的对象类型Double吗,还是最好 ArrayList<Double>calculations = new ArrayList(); 只需检查可调用项是否已完成以添加到ArrayList?不会进行任何转换 关于哪个更好的问题,你的意见有些分歧

如果你有

 ArrayList<Future<Double>>calculations = new ArrayList();
或者任何将来的对象,在这种情况下,当callable完成运行时,它会自动从未来值转换为所需的对象类型Double吗,还是最好

 ArrayList<Double>calculations = new ArrayList();

只需检查可调用项是否已完成以添加到ArrayList?

不会进行任何转换

关于哪个更好的问题,你的意见有些分歧。 这取决于您的应用程序,但如果您试图保留一个计算列表及其结果,下面的方法将是一个可靠的方法。 如果您不担心RAM,那么一个很好的解决方案是“非此即彼”或“非此即彼”

使用下面的代码,您可以维护对计算和结果的引用,并且如果以后需要执行更多操作,您可以使用聚合操作来简化复杂操作

    List<Future<Double>> calculations = new ArrayList();
    List<Double> results = new ArrayList();

    calculations.stream().forEach((Future<Double> _item) -> {
        try {
            results.add(_item.get());
        } catch (InterruptedException ex) {
            // do something
        } catch (ExecutionException ex) {
            // do something
        }
    });

想必你想要的是一系列的结果,比如

List<Double> results

并且避免将所有结果单独列出。

不会发生自动转换:未来并没有什么神奇之处——如果你把它放在列表中,你就会得到它。你可以使用其中的任何一个。
Double getResult(index i) {
    if ( calculations.get(i).isDone() )  {
        return calculations.get(i).get();
    } else {
        // Do something else
    }
}