获取在封闭范围内定义的局部变量必须是最终的或有效的最终

Getting local variable defined in the enclosing scope must be final or effective final

我收到“封闭范围内定义的局部变量必须是最终的或有效的最终变量”,如下突出显示。我不确定如何在 lambda 表达式中解决这个问题。

synchronizationVBOVO.getProductVO().getProducts().forEach(eachProduct -> {
        Products product = v1UserIdaasEntitlementRequest.new Products();
        product.setName(eachProduct.getProductName());
        Product entitleProduct = entitlementResponse.getProducts().stream()
                .filter(entitleproduct -> entitleproduct.getName().equalsIgnoreCase(eachProduct.getProductName()))
                .findAny().orElse(null);
        List<Packages> packages = new ArrayList<>();
        Packages pack = v1UserIdaasEntitlementRequest.new Packages();
        eachProduct.getPackages().forEach(productPack -> {
            pack.setName(productPack.getPack().getPackageName());
            Package entitlePackage = new Package();
            if(null != entitleProduct && null != entitleProduct.getPackages() && !entitleProduct.getPackages().isEmpty()) {
                 entitlePackage =  entitleProduct.getPackages().stream().filter(
                    entitlePack -> 
                        entitlePack.getName().equalsIgnoreCase(productPack.getPack().getPackageName()))
                    .findAny().orElse(null);
            }
            List<RumLimits> rumLimits = new ArrayList<>();
            RumLimits rumlimit = v1UserIdaasEntitlementRequest.new RumLimits();
            productPack.getPack().getRumLimits().forEach(rumLimit -> {
                setRumLimits(entitlePackage, rumLimits, rumlimit, rumLimit);
                Wallet wallet = v1UserIdaasEntitlementRequest.new Wallet();
                setWallet(v1UserIdaasEntitlementRequest, pack, entitlePackage, wallet);
            });
            pack.setRumLimits(rumLimits);
            packages.add(pack);
        });
        product.setPackages(packages);
        allProducts.add(product);
    });

您正在更改变量 entitlePackage 的值。您正在分配一个值,即 new Package() 但在 if 语句中您正在分配一个不同的值。

effectively final表示变量只能赋值一次。

您只能通过在 if 中添加 else 来赋值一次。

Package entitlePackage;
if(null != entitleProduct && null != entitleProduct.getPackages() && !entitleProduct.getPackages().isEmpty()) {
    entitlePackage =  entitleProduct.getPackages().stream().filter(
                    entitlePack -> 
                        entitlePack.getName().equalsIgnoreCase(productPack.getPack().getPackageName()))
                    .findAny().orElse(null);
}
else {
    entitlePackage = new Package();
}

尝试替换这个:

Package entitlePackage = new Package();
if(null != entitleProduct && null != entitleProduct.getPackages() && !entitleProduct.getPackages().isEmpty()) {
                 entitlePackage =  entitleProduct.getPackages().stream().filter(
                    entitlePack -> 
                        entitlePack.getName().equalsIgnoreCase(productPack.getPack().getPackageName()))
                    .findAny().orElse(null);
}

通过这个:

Package entitlePackage =
        Optional.ofNullable(entitleProduct)
                .map(Product::getPackages)
                .map(Collection::stream)
                .orElse(Stream.empty())
                .filter(e -> productPack.getPack()
                                        .getPackageName()
                                        .equalsIgnoreCase(e.getName()))
                .findAny()
                .orElseGet(Package::new);

entitlePackage 实际上是最终的。此外,您的代码将更易于阅读和维护。