Преобразовать список <HashMap <String, Object >> в поток - PullRequest
1 голос
/ 02 апреля 2019

У меня есть список этого типа List<HashMap<String, Object>> ResultSet, который содержит результат запроса к базе данных. Я хотел вызвать stream () для объекта List. Как я могу это сделать ? Этот код создать мой список:

public class ResultSetToMap {
    int Columns = 0;
    List<Map<String, String>> data = new ArrayList<Map<String, String>>();
    HashMap<String, Object> row = new HashMap<>();

    public List ResultSetToMap(ResultSet rs) throws SQLException {
        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();
        List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();

        while (rs.next()) {
            row = new HashMap<String, Object>(columns);
            for (int i = 1; i <= columns; ++i) {
                row.put(md.getColumnName(i), rs.getObject(i));
            }
            list.add(row);
        }
        return list;

    }
}

Я могу запросить данные списка следующим образом:

for (HashMap<String, Object> map : list) {
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
}

И я хочу сделать запросы об этих данных позже. Типа:

films.stream()
    .filter(Film.LENGTH.greaterThan(60))
    .sorted(Film.TITLE)
    .forEach(System.out::println);

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Помимо того, что вам лучше фильтровать и сортировать данные в SQL, вы должны использовать объект Film вместо Map:

public class Film {
    private String title;
    private int length;
    // more attributes if you have ...

    public Film(String title, int length) {
        this.title = title;
        this.length = length;
    }

    public String getTitle() {
        return title;
    }

    public int getLength() {
        return length;
    }

    @Override
    public String toString() {
        return title + " : " + length;
    }
}

Теперь вы можете использовать это при создании списка результатов:

public List<Film> getFilmsFromResultSet(ResultSet rs) throws SQLException {
    List<Film> result = new ArrayList<>();

    while (rs.next()) {
        result.add(new Film(rs.getString("TITLE"), rs.getInt("LENGTH")));
    }

    return result;
}

Используйте имена столбцов из вашей таблицы в методах rs.getInt() и rs.getString().

Используйте ваши getFilmsFromResultSet() методы, например:

List<Film> films = getFilmsFromResultSet(rs);
films.stream()
        .filter(f -> f.getLength() > 60)
        .sorted(Comparator.comparing(Film::getTitle))
        .forEach(System.out::println);
1 голос
/ 02 апреля 2019

Потоковый список вызывается с помощью stream() объекта List.

Пример:

list.stream()
    .filter(row -> ((Number) row.get("LENGTH")).intValue() > 60)
    .sorted(Comparator.comparing(row -> (String) row.get("TITLE")))
    .forEach(System.out::println);

Обратите внимание, что было бы лучше создать список объектов, представляющихданные строк вместо списка карт, поэтому данные могут обрабатываться безопасным для типов способом.

1 голос
/ 02 апреля 2019

Вы можете просто использовать flatMap операцию как:

list.stream()
        .flatMap(map -> map.entrySet().stream())
        .forEach(entry -> System.out.println(entry.getKey() + " : " + entry.getValue()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...