【发布时间】:2019-01-17 15:18:15
【问题描述】:
这个问题已经被问过了。但是今天我发现了一些奇怪的东西。对于以下代码:-
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 有效。如何以及为什么?这样做有效吗?
【问题讨论】:
-
您不是在修改引用本身,而是添加到
ArrayList- 这会起作用,但不鼓励...... -
还请注意,在您的情况下,您根本不需要
stream;List::forEach存在 -
你能问一下为什么不鼓励吗?请解释更多。推荐的方式是什么?
-
推荐使用
map(....).collect(Collectors.toList())的方法。在文档中搜索副作用 -
您可以改进您的代码,在
EsbBucketInstanceDefinition中创建一个构造函数,并在collect的流中使用map:public static List<EsbBucketInstanceDefinition> convertBucketDefinitionList(List<BucketInstanceDefinitionV1> bucketInstanceDefinitionV1List) { return bucketInstanceDefinitionV1List.stream() .map(e -> new EsbBucketInstanceDefinition(e.getInstanceType(), e.getReportingGroup(), e.getSliceVolume(), e.getCounterName(), e.getSubscriberGroupId())) .collect(Collectors.toList()); }
标签: java variables java-8 java-stream final