Как использовать потоковый фильтр для списка hashmap? - PullRequest
1 голос
/ 05 ноября 2019

Я хочу отфильтровать список массивов, содержащий хеш-карты, используя потоковый 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);
}
return resultslist;

Вышеуказанный метод возвращает resultslist. Теперь я хочу отфильтровать этот список по некоторому условию и собрать новый список массивов хеш-карт.

Например, я хочу выбрать хеш-карты с нулевым значением, а строка "parent_item_id".

Я попробовал следующее.

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Ну вопрос неясен, отсюда и другое решение для фильтрации карт с 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());
0 голосов
/ 05 ноября 2019

Если вы просто пытаетесь сократить свой список хеш-карт, основываясь на наличии значения от == до 0, это сделает работу. Однако при сопоставлении со String, Object создается впечатление, что вы действительно должны создавать объект вместо карты.

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_item_id является целым числом. Еще одна причина, чтобы переключить все, что есть на вашей карте, на реальный объект вместо того, чтобы пытаться смоделировать его на карте, где мы должны угадать, какой тип у каждого из ваших значений.

...