Java 8 lambda 中使用的流变量应该是 final 或有效的 final
Java 8 stream variable used in lambda should be final or effectively final
这个问题已经有人问过了。但是今天我发现了一些奇怪的事情。对于以下代码:-
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 中(有效地)引用 final 变量。
finalResponse
持有的引用实际上是最终的,因为它永远不会改变。请注意,更改引用意味着为其分配新值,例如
finalResponse = someOtherList;
更改所引用对象的状态(例如,将项目添加到finalResponse
所引用的列表中)与变量所持有的值无关finalResponse
,即
finalResponse.add(something);
不改变变量finalResponse
;它只会更改 finalResponse
所指的对象。
这个问题已经有人问过了。但是今天我发现了一些奇怪的事情。对于以下代码:-
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 中(有效地)引用 final 变量。
finalResponse
持有的引用实际上是最终的,因为它永远不会改变。请注意,更改引用意味着为其分配新值,例如
finalResponse = someOtherList;
更改所引用对象的状态(例如,将项目添加到finalResponse
所引用的列表中)与变量所持有的值无关finalResponse
,即
finalResponse.add(something);
不改变变量finalResponse
;它只会更改 finalResponse
所指的对象。