当前位置: 首页 > 知识库问答 >
问题:

如何对hashmap列表使用流过滤器?ArrayList

宋航
2023-03-14

我想使用流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);
}

上述方法给出了结果列表。现在,我想通过一些条件过滤这个列表,并收集一个新的哈希映射数组列表。

例如,我想选择具有“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个答案

沈巴英
2023-03-14

与其他类似,但可以使用谓词。

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()){code>期间使用此谓词,并且:

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);
}
端木骞尧
2023-03-14

这个问题还不清楚,因此,另一种过滤带有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());
上官鸿朗
2023-03-14

如果您只是尝试根据存在的值==将哈希映射列表减少到0,那么这将完成任务。然而,使用字符串、对象进行映射似乎真的应该创建一个对象而不是一个映射。

List<Map<String, Object>> reducedList = access_collections.stream()
                .filter(hashmap -> hashmap.containsKey("parent_item_id"))
                .filter(hashmap -> (Integer) hashmap.get("parent_item_id") == 0)
                .collect(Collectors.toList());

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

 类似资料:
  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 过滤字段的列表,每一个成员应该是数组或对象 $data = [ ['id'=>1, 'name'=>'a'], ['id'=>2, 'name'=>'b'], ]; // 两个毫无意义的实例化写法 $list = new FilterableList; $list = new FilterableList($data); // 只保留 name 字段 $list = new Fi

  • 问题内容: 我敢肯定这是一个微不足道的操作,但是我不知道它是如何完成的。 肯定有比这更聪明的东西: 我正在寻找将它们全部添加到一个查询中,例如: 如何使用值列表过滤Django查询? 问题答案: 从Django文档中:

  • 我有一个物体,如下所示 给定MyObject的列表,是否可以使用Java8个流来过滤类型和子类型? 目前为止我有 但在这一部分中,我还希望在每个子类型上使用另一个过滤器来过滤特定子类型上的过滤器。我想不出怎么做。 例如 我会传入匹配类型B和子类型Z,所以我希望得到一个结果- 以下当前返回列表中的2个项目。 但是我想在每个子类型上添加一个额外的过滤器,并且只匹配“Z”存在的地方。

  • 问题内容: 我在此论坛和Google中搜索后发布了查询,但无法解决相同的问题。 我正在尝试根据列表1中的值过滤列表2(多列)。 码 在上面的代码中,如果我提供特定值,则可以过滤,但不确定如何检查列表2中的Car Name是否在列表1中退出。 希望我面对的问题很清楚,等待指导(对于Java来说还是比较新的,因此,如果上述查询非常基础,请原谅)。 编辑, 我相信上面提供的链接3应该可以解决,但就我而言