当前位置: 首页 > 知识库问答 >
问题:

在lambda中使用的Java 8流变量应该是final或实际上是final[重复]

谢修真
2023-03-14
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在工作。怎么做,为什么?这样做有效吗?

共有1个答案

於和志
2023-03-14

只能引用(实际上)lambda中的最终变量。

FinalResponse持有的引用实际上是final,因为它从不更改。请注意,更改引用意味着为其赋一个新值,例如

finalResponse = someOtherList;

更改所引用对象的状态(例如向FinalResponse引用的列表中添加项)与变量FinalResponse所包含的值无关,即

finalResponse.add(something);
 类似资料: