如您所知,“在封闭范围内定义的局部变量必须是最终的或实际上是最终的”。所以我有以下代码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个赞
你的 lambda 被称为闭包,因为它从外部范围(这里是你的数组)捕获一些东西。
完全不鼓励使用捕获旨在修改的对象的闭包。这是因为它可能只在本地模式下工作:实际上在序列化/反序列化后的集群模式下,每个捕获的对象都会有一个独立存在于每个 JVM 上的版本。
做你想做的最干净的方法可能是使用Accumulators
精慕HU
TA贡献1845条经验 获得超8个赞
您可以像这样将结果直接映射到列表:
List<Airline> filteredAirlines = rdd.map(f -> {
......
results = foo();
System.out.println(results.getFilteredAirlines().size());
return results.getFilteredAirlines();
}).collect(Collectors.toList());
跃然一笑
TA贡献1826条经验 获得超6个赞
我不知道什么rdd
是什么,rdd.map()
做什么,但你传递给它的 lambda 表达式并不意味着它会立即执行(或根本不执行)。
因此,当您在代码段的最后一行打印时filteredArilines.size()
,lambda 表达式可能尚未执行,因此List
仍然是空的。
添加回答
举报
0/150
提交
取消