public static List<EsbBucketInstanceDefinition> convertBucketDefinitionList(List<BucketInstanceDefinitionV1> bucketInstanceDefinitionV1List) {
List<EsbBucketInstanceDefinition> response = new ArrayList<>();
List<EsbBucketInstanceDefinition> finalResponse = new ArrayList<>();
bucketInstanceDefinitionV1List.stream().forEach(e -> {
EsbBucketInstanceDefinition esbBucketInstanceDefinition = new EsbBucketInstanceDefinition();
esbBucketInstanceDefinition.setInstanceType(e.getInstanceType());
esbBucketInstanceDefinition.setReportingGroup(e.getReportingGroup());
esbBucketInstanceDefinition.setSliceVolume(e.getSliceVolume());
esbBucketInstanceDefinition.setCounterName(e.getCounterName());
esbBucketInstanceDefinition.setSubscriberGroupId(e.getSubscriberGroupId());
// response.add(esbBucketInstanceDefinition); compiler error variable used in lambda should be final or effective final
finalResponse.add(esbBucketInstanceDefinition);
});
return finalResponse;
}
因为这很管用。看起来只有变量名finalResponse在工作。怎么做,为什么?这样做有效吗?
只能引用(实际上)lambda中的最终变量。
FinalResponse
持有的引用实际上是final,因为它从不更改。请注意,更改引用意味着为其赋一个新值,例如
finalResponse = someOtherList;
更改所引用对象的状态(例如向FinalResponse
引用的列表中添加项)与变量FinalResponse
所包含的值无关,即
finalResponse.add(something);
这个问题以前在这里问过 我关于为什么在这里回答的问题 但我对这个答案有一些怀疑。提供的答案提到- 为了降低bug的风险,他们决定确保捕获的变量永远不会变异。我对它会导致并发问题的说法感到困惑。 我在Baeldung上读了一篇关于并发问题的文章,但我仍然对它如何导致并发问题感到有点困惑,有人能用一个例子来帮助我吗?提前谢了。
当我在写这段代码时,我得到了一个编译时错误,它说:“lambdas中的变量必须是final或实际上是final”。
我正在研究Java8流,我理解lambdas的唯一问题是为什么lambdas中有效的最后警告被忽略,例如实例(和静态)变量。我似乎在网上找不到任何关于它的参考,因为大多数页面只会谈论“有效最终”的定义。
问题内容: lambda表达式中使用的变量应该是final或有效的final 当我尝试使用它时会显示此错误。 问题答案: 可变装置,它可以被实例化一次。在Java中,你不能在lambda以及匿名内部类中使用非最终变量。 你可以使用旧的for-each循环来重构代码: 即使我对这段代码有些不了解: 你调用;而不使用其返回值 使用分配,;你不会修改原始传递的内容,并且你不会在此方法中使用它 你总是返回
这个问题在这里已经有了答案: > 为什么匿名类只能访问最终变量? 为什么对于实例变量[重复]忽略“Lambda表达式中使用的变量必须是final或实际上是final”警告 “lambda在start方法参数被垃圾回收后才能运行”是什么意思? 为什么要复制?
lambda表达式中使用的变量应为final或有效final 当我尝试使用时,它显示了这个错误。