封闭范围中定义的局部变量列表必须是最终的或实际上是最终的

时间:2019-05-09 16:56:00

标签: lambda java-8

我有一种方法,正在如下调用executor.sumbit(),

List<Stock> stockList ;

        executor.submit( ()-> {
            stockList = stockService.getAllStocks();
        });

我正面临“在封闭范围内定义的局部变量stockList必须是最终的或实际上是最终的”编译器错误。我尝试在Google的帮助下解决问题,但没有运气:-(

感谢任何帮助或建议,谢谢!

1 个答案:

答案 0 :(得分:1)

由于库存服务返回列表,所以为什么不执行以下操作:

    List<Stock> stockList = new ArrayList<>();

    executor.submit( ()-> {
        List<Stock> temp = stockService.getAllStocks());
        stockList.addAll(temp);
        //now that it's copied, submit to the executor.
        return temp;
    });

由于stockList是引用,因此您无需更改引用,而只需更改stockList引用的内容。因此,您不会违反有效的最终要求。注意:由于执行程序服务会立即返回,因此填充列表之前可能会有一段时间。