代码之家  ›  专栏  ›  技术社区  ›  masiboo

在lambda中使用的Java 8流变量应该是最终的或有效的最终[复制]

  •  2
  • masiboo  · 技术社区  · 6 年前

    这个问题已经问过了。但今天我发现了一些奇怪的东西。以下代码:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Bohemian    6 年前

    只能从lambda中引用(有效地)最终变量。

    证明人 finalResponse 因为它永远不会改变。请注意,更改引用意味着为其分配一个新值,例如

    finalResponse = someOtherList;
    

    改变 状态 引用的对象(例如将项添加到引用的列表中) 最终响应 )与变量所持有的值无关 最终响应 IE

    finalResponse.add(something);
    

    不更改变量 最终响应 ;它只更改对象 最终响应 指。