【发布时间】:2021-11-26 00:01:02
【问题描述】:
我想比较 Java 中的两个 HashMap 列表。我想了解一种使用 lambda 表达式而不是嵌套 for 循环来比较它们的方法。
HashMap 的两个列表:
- productDetailsFromInputData;
样本数据:
[{ProductName=Prod1, Quantity=1.0, Perpetual=true},
{ProductName=Prod2, Quantity=1.0, Perpetual=false},
{ProductName=Prod3, Quantity=1.0, Perpetual=false}]
- productDetailsFromApplication;
样本数据:
[{Perpetual=true, ProductName=Prod1, Quantity=1.0},
{Perpetual=true, ProductName=Prod2, Quantity=1.0},
{Perpetual=false, ProductName=Prod3, Quantity=2.0},
{Perpetual=false, ProductName=Prod4, Quantity=1.0},
{Perpetual=false, ProductName=Prod5, Quantity=1.0},
{Perpetual=false, ProductName=Prod6, Quantity=1.0}]
逻辑: 我想遍历 productDetailsFromInputData 列表并获取每个哈希图的 ProductName 值,检查该值是否存在于 productDetailsFromApplication 列表中存在的任何哈希图中。如果不是,则将结果标记为失败。
如果 ProductName 作为值存在于 productDetailsFromApplication List 的任何一个 hashmap 中,则从该 hashmap 中获取 Perpetual 和 Quantity 值,并将其与 productDetailsFromInputData 列表中的 hashmap 进行比较。
到目前为止,我已经尝试过以下方法:
for(HashMap<String,Object> inputProductHashMap : productDetailsFromInputData) {
String productName = inputProductHashMap.get("ProductName").toString();
String inputQuantity = inputProductHashMap.get("Quantity").toString();
String inputPerpetual = inputProductHashMap.get("Perpetual").toString();
LOGGER.info("Validating Product details for Product "+productName);
if(productDetailsFromApplication.stream().anyMatch(t->t.containsValue(productName))){
productDetailsFromApplication.stream()
.filter(p->p.containsValue(productName))
.findAny().ifPresent(p->
{
String AppQuantity = p.get("Quantity").toString();
String AppPerpetual = p.get("Perpetual").toString();
LOGGER.info("Found the Product details in SFDC matching with input data");
if(!inputQuantity.equalsIgnoreCase(AppQuantity)){
LOGGER.error("APP Quantity does not matches with Input Quantity for Product "+productName
+" App Quantity "+AppQuantity+" Input Quantity "+inputQuantity);
Assert.fail("Product Validation Failed for "+productName);
}
if(!inputPerpetual.equalsIgnoreCase(AppPerpetual)){
LOGGER.error("App Perpetual value does not matches with Input Perpetual value for Product "
+productName +" App Perpetual "+AppPerpetual+" Input perpetual "+inputPerpetual);
Assert.fail("Product Validation Failed "+productName);
}
});
}
else {
LOGGER.error("Did not find any matching Product Name with the given details in App");
return false;
}
}
我想了解是否有办法删除第一个 for 循环。由于我对使用 lambda 和流还很陌生,我该如何优化它。
如果代码到达LOGGER.error 部分,我还想知道一种返回布尔值的方法,我目前在该部分添加了断言来标记失败。
如果存在涵盖此问题解决方案的现有 Stack-overflow 问题,请随时指导我。
【问题讨论】:
-
Lambda 还是流?它是哪一个?它们不是一回事。
-
为什么?比较它们的正确方法是使用
List.equals()。您不必执行任何这些操作。
标签: java lambda java-stream