【问题标题】:Getting local variable defined in the enclosing scope must be final or effective final获取在封闭范围中定义的局部变量必须是最终的或有效的最终的
【发布时间】:2021-03-16 04:45:05
【问题描述】:

我得到“在封闭范围中定义的局部变量必须是最终的或有效的最终”,如下所示。我不确定如何在 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);
    });

【问题讨论】:

    标签: java lambda collections java-8 java-stream


    【解决方案1】:

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

    实际上是最终的意味着该变量只能被赋值一次。

    您只能通过将else 添加到if 来分配一次值。

    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();
    }
    

    【讨论】:

      【解决方案2】:

      尝试替换这个:

      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 实际上是最终的。此外,您的代码将更易于阅读和维护。

      【讨论】:

        猜你喜欢
        • 2017-08-28
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 2021-03-31
        相关资源
        最近更新 更多