Java 8 过滤 ListOfMap 用于检查键是否存在,如果存在则收集映射



下面是从结果集中收集列表映射并检查列表映射以获取特定产品的代码,如果产品存在,则获取该映射。 请帮助我在java8中做到这一点

List<Map<String,Object>>    lmProducts  =   new ArrayList<Map<String, Object>>();
Map<String, Object>         map         =   null;
try {
if(resultSet.next()){
System.out.println("PRODUCTt PRICEt QUANTITY");
do{
map  =   new HashMap<String, Object>();
map.put("NAME", resultSet.getString("NAME"));
map.put("PRICE", resultSet.getString("PRICE"));
map.put("QUANTITY", resultSet.getString("QUANTITY"));
System.out.println(resultSet.getString("NAME")+"t "+resultSet.getInt("PRICE")+"t "+resultSet.getInt("QUANTITY"));
lmProducts.add(map);
}while (resultSet.next());
}
}catch (SQLException e){
System.out.println("Exception while processing Resultset: "+e.toString());
}

尝试通过检查关键条件来获取 mProduct 映射

Map<String, Object> mProductMap     =   new HashMap<String, Object>();
mProductMap     =   lmProducts.stream().filter(m -> m.get("NAME").toString().equalsIgnoreCase(sProductName)).collect(to)

您可以使用Collectors.toMapcollect地图中的所有条目组合。

Map<String, Object> mProductMap = lmProducts.stream()
.flatMap(a -> a.entrySet().stream()) // stream of entries of all maps
// entries with specific key and value combination
.filter(m -> m.getKey().equals("NAME") && m.getValue().toString().equalsIgnoreCase(sProductName)) 
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

你也可以这样做,因为Map是唯一的键值对检查Map包含该键和值,然后将其收集到Map

Map<String,Object> result = list.stream()
.filter(m->m.containsKey("NAME") && m.get("NAME").toString().equalsIgnoreCase(sProductName))    // check map contains that key and value
.collect(Collectors.toMap(key->"NAME",value->value.get("NAME")));  //collect it to Map

注意假设列表中有两个具有相同键的映射对象,那么它将抛出异常

java.lang.IllegalStateException: Duplicate key NAME

因此,要忽略这种情况,请使用合并功能toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)

.collect(Collectors.toMap(key->"NAME",value->value.get("NAME"), (v1,v2)->v1));

如果我正确获取了您的代码,您正在寻找类似以下内容:

Predicate<Map<String, Object>> hasExpectedName = 
prod -> prod.containsKey("NAME") && prod.get("NAME").toString().equalsIgnoreCase(sProductName);
Map<String, Object> mProductMap = 
lmProducts.stream()
.filter(hasExpectedName)
.findFirst()
.orElse(null);    // <= return null or a default value
// .orElseThrow(...) // <= or you can throw an exception if you want

虽然我会以更多的 OOP 风格做:

定义用于保存产品数据的类:

static class Product {
private String name;
private String price;
private String quantity;
// Constructor & setters & getters
}

然后将数据提取到产品对象中:

// ...
System.out.println("PRODUCTt PRICEt QUANTITY");
do {
product = new Product(
resultSet.getString("NAME"),
resultSet.getString("PRICE"),
resultSet.getString("QUANTITY")
);
// System.out.println(...);
products.add(product);
} while (resultSet.next());
// ...

从现在开始,流操作非常简单:

Product product = products.stream()
.filter(p -> p.getName().equalsIgnoreCase(sProductName))
.findFirst()   // or .findAny()
.orElse(null); // or a default value

相关内容

最新更新