获取在封闭范围内定义的局部变量必须是最终的或有效的最终
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
实际上是最终的。此外,您的代码将更易于阅读和维护。
我收到“封闭范围内定义的局部变量必须是最终的或有效的最终变量”,如下突出显示。我不确定如何在 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
实际上是最终的。此外,您的代码将更易于阅读和维护。