为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2023-03-31 09:43:42
如您所知,“在封闭范围内定义的局部变量必须是最终的或实际上是最终的”。所以我有以下代码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 表达式中的值?谢谢。
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

  1. 你的 lambda 被称为闭包,因为它从外部范围(这里是你的数组)捕获一些东西。

  2. 完全不鼓励使用捕获旨在修改的对象的闭包。这是因为它可能只在本地模式下工作:实际上在序列化/反序列化后的集群模式下,每个捕获的对象都会有一个独立存在于每个 JVM 上的版本。

  3. 做你想做的最干净的方法可能是使用Accumulators


查看完整回答
反对 回复 2023-03-31
?
精慕HU

TA贡献1845条经验 获得超8个赞

您可以像这样将结果直接映射到列表:


List<Airline> filteredAirlines = rdd.map(f -> {

      ......

      results = foo();

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

      return results.getFilteredAirlines();

}).collect(Collectors.toList());


查看完整回答
反对 回复 2023-03-31
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我不知道什么rdd是什么,rdd.map()做什么,但你传递给它的 lambda 表达式并不意味着它会立即执行(或根本不执行)。

因此,当您在代码段的最后一行打印时filteredArilines.size(),lambda 表达式可能尚未执行,因此List仍然是空的。


查看完整回答
反对 回复 2023-03-31
  • 3 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信