猿问

Lambda 函数不会从外部作用域更新数组

如您所知,“在封闭范围内定义的局部变量必须是最终的或实际上是最终的”。所以我有以下代码


List<Airline> filteredAirlines = new ArrayList<>();

JavaRDD<Company> flightCompanyJavaRDD = rdd.map(f -> {

      ......

      results = foo(f);

      filteredAirlines.addAll(results.getFilteredAirlines());

      System.out.println(results.getFilteredAirlines().size());

      Company convertedCompanyResult = convert(results);

      return convertedCompanyResult;

});

......

System.out.println(filteredArilines.size());

Line 1 printed1和 line 2 printed 0。似乎该列表filteredArilines未被填充。任何想法为什么?以及如何获取外部可用的 lambda 表达式中的值?谢谢。


拉丁的传说
浏览 98回答 3
3回答

吃鸡游戏

你的 lambda 被称为闭包,因为它从外部范围(这里是你的数组)捕获一些东西。完全不鼓励使用捕获旨在修改的对象的闭包。这是因为它可能只在本地模式下工作:实际上在序列化/反序列化后的集群模式下,每个捕获的对象都会有一个独立存在于每个 JVM 上的版本。做你想做的最干净的方法可能是使用Accumulators

精慕HU

您可以像这样将结果直接映射到列表:List<Airline> filteredAirlines = rdd.map(f -> {&nbsp; &nbsp; &nbsp; ......&nbsp; &nbsp; &nbsp; results = foo();&nbsp; &nbsp; &nbsp; System.out.println(results.getFilteredAirlines().size());&nbsp; &nbsp; &nbsp; return results.getFilteredAirlines();}).collect(Collectors.toList());

跃然一笑

我不知道什么rdd是什么,rdd.map()做什么,但你传递给它的 lambda 表达式并不意味着它会立即执行(或根本不执行)。因此,当您在代码段的最后一行打印时filteredArilines.size(),lambda 表达式可能尚未执行,因此List仍然是空的。
随时随地看视频慕课网APP

相关分类

Java
我要回答