[英]java 8 filter a ListOfMap for checking a key exists, if exists then collect a map
下面是從結果集中收集 listofmap 並檢查特定產品的 listofmap 的代碼,如果產品存在,則獲取該地圖。 請幫我在java8中做
List<Map<String,Object>> lmProducts = new ArrayList<Map<String, Object>>();
Map<String, Object> map = null;
try {
if(resultSet.next()){
System.out.println("PRODUCT\t PRICE\t 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.toMap
從地圖中collect
所有條目。
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
}
然后將數據提取到 Product 對象中:
// ...
System.out.println("PRODUCT\t PRICE\t 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.