如何使用流过滤器作为哈希表列表? ArrayList <HashMap <String,Object >>

时间:2019-11-05 10:59:08

标签: java java-8 java-stream

我想使用流API过滤包含哈希映射的数组列表。

ArrayList<HashMap<String, Object>> resultslist = new ArrayList<HashMap<String, Object>>();   


ResultSet rs = pstmt.executeQuery();

while (rs.next()) {
    HashMap<String, Object> returndatas = new HashMap<String, Object>();
    int colcnt = rs.getMetaData().getColumnCount();

    for (int i = 1; i <= colcnt; i++) {
        if (rs.getObject(i) instanceof BigInteger) {
            returndatas.put(rs.getMetaData().getColumnName(i), rs.getInt(i));
        } else {
            returndatas.put(rs.getMetaData().getColumnName(i), rs.getObject(i));
        }
    }
    resultslist.add(returndatas);
}

以上方法给出了resultslist。现在,我想按某种条件过滤此列表,并收集一个新的哈希图数组列表。

例如,我要选择具有“ null”值和字符串具有“ parent_item_id”的哈希映射。

我尝试了以下方法。

    ArrayList<HashMap<String, Object>> reducedList = resultslist .stream()
    .filter((HashMap<String, Object> hasmap) -> hasmap.entrySet().stream().anyMatch(e -> e.getKey().equals("parent_item_id") && e.getValue().equals(0)))
    .collect(Collectors.toList());

终于可以了

我用了这个。谢谢大家

List<HashMap<String, Object>> reducedList = resultslist.stream()
                    .filter(hashmap ->((hashmap.get("parent_item_id")) == null ))
                    .collect(Collectors.toList());

3 个答案:

答案 0 :(得分:0)

如果您只是基于将值==减小为0来减少哈希表列表,则可以完成此工作。但是,使用String,Object进行映射使您似乎确实应该创建对象而不是映射。

a

根据上面的代码段,我假设parent_item_id是一个整数。将地图中的任何内容切换为实际对象而不是尝试在地图中建模的另一个原因是我们必须猜测每个值是哪种类型。

答案 1 :(得分:0)

问题还不清楚,因此,另一种使用null过滤地图的解决方案:

// If you are sure the key "parent_item_id" exists:
List<HashMap<String, Object>> reducedList = 
        access_collections.stream()
                          .filter(m -> m.get("parent_item_id") == null)
                          .collect(toList());

// If you are not sure then:
List<HashMap<String, Object>> reducedList = 
        access_collections.stream()
                          .filter(m -> m.containsKey("parent_item_id") && m.get("parent_item_id") == null)
                          .collect(toList());

答案 2 :(得分:0)

与其他类似,但是您可以使用Predicate

Predicate<HashMap<String, Object>> containsKey = hashmap -> hashmap.containsKey("parent_item_id");
Predicate<HashMap<String, Object>> isNull = hashmap -> hashmap.get("parent_item_id") == null;

List<Map<String, Object>> reducedList = access_collections.stream()
        .filter(containsKey.and(isNull))
        .collect(Collectors.toList());

或者您可以在while (rs.next()) {和以下期间使用此谓词:

if (containsKey.and(isNull).test(returndatas)) {
    resultslist.add(returndatas);
}

更新

下面仅是可能使第一个解决方案模糊化的概括(因为没有向解决方案添加任何内容的练习): 将Predicate更改为BiPredicate,并获得更多通用解决方案。

BiPredicate<String, HashMap<String, Object>> containsKey = 
        (label, hashmap) -> hashmap.containsKey(label);
BiPredicate<String, HashMap<String, Object>> isNull = 
        (label, hashmap) -> hashmap.get(label) == null;

Function<String, Predicate<HashMap<String, Object>>> checkFor =
        (label) -> (hashmap) -> containsKey.and(isNull).test(label, hashmap);

Predicate<HashMap<String, Object>> checkParentItemId = checkFor.apply("parent_item_id");

List<Map<String, Object>> reducedList = access_collections.stream()
        .filter(checkParentItemId)
        .collect(Collectors.toList());

if (checkFor.apply("parent_item_id").test(returndatas)) {
    resultslist.add(returndatas);
}