Как отфильтровать карту по списку ключей в Java

Научитесь фильтровать Map по ключам или значениям с помощью цикла forEach() и API Stream.filter() в Java 8.

1. Настройка

Для примеров кода мы будем использовать следующую карту пользователей. Ключи карты — это целые типы, а значения карты — экземпляры пользователя.

Map<Integer, User> usersMap = Map.of(1, new User(1, "Alex"),2, new User(2, "Allen"),3, new User(3, "Brian"),4, new User(4, "Bob"),5, new User(5, "Charles"),6, new User(6, "David"),8, new User(7, "Don"),9, new User(8, "Dave"));

Мы отфильтруем Карту по следующему Списку ключей. Список может содержать что угодно. Мы сохраняем идентификаторы пользователей, чтобы примеры было легко понять.

List<Integer> idList = List.of(1,3,5,7);

2. Фильтрация карты по списку ключей

Предположим, у нас есть список идентификаторов пользователей, и мы хотим получить подкарту, состоящую из пользователей, идентификаторы которых присутствуют в списке.

Для этого мы переберем EntrySet карты. Затем мы проверим наличие идентификатора в списке в функции filter(). Наконец, мы соберем соответствующие наборы записей в новой карте с помощью Collectors.toUnmodifiableMap().

Map<Integer, User> filteredMap = usersMap.entrySet().stream().filter(entry -> idList.contains(entry.getKey())).collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue));System.out.println(filteredMap);

Вывод программы.

{1=User(id=1, name=Alex), 3=User(id=3, name=Brian), 5=User(id=5, name=Charles), 7=User(id=7, name=Don)}

Если мы хотим изменить критерии оценки, то нам нужно изменить выражение в функции filter(). Например, если мы хотим проверить идентификатор пользователя в списке, то измените выражение filter() следующим образом:

....filter(entry -> idList.contains(entry.getValue().getId()))...

3. Фильтрация карты и сбор значений в список

Другой вариант использования — когда мы хотим отфильтровать карту и собрать значения в список для наборов записей, ключ которых присутствует в списке.

List<User> usersList = usersMap.values().stream().filter(user -> idList.contains(user.getId())).collect(Collectors.toUnmodifiableList());System.out.println(usersList);

Вывод программы.

[User(id=1, name=Alex), User(id=3, name=Brian), User(id=5, name=Charles), User(id=7, name=Don)]

4. Фильтрация карты с помощью forEach()

Мы также можем фильтровать Map с помощью цикла forEach(). Цикл forEach принимает действие Consumer, которое принимает один входной аргумент и не возвращает никакого результата.

В нашем случае мы передадим Map.Entry Потребителю и сопоставим ключ или значение из элемента List. Если Entry соответствует условию, мы добавим entry.getValue() в новый List.

List<User> usersList = new ArrayList<>();usersMap.entrySet().forEach( entry -> {if(idList.contains(entry.getValue().getId())) {usersList.add(entry.getValue());}});System.out.println(usersList);

Вывод программы.

[User(id=1, name=Alex), User(id=3, name=Brian), User(id=5, name=Charles), User(id=7, name=Don)]

5. Заключение

В этом уроке Java мы научились фильтровать HashMap по ключам или значениям и собирать соответствующие экземпляры Entry в подкарту. Мы также научились собирать значения в List после фильтрации ключей Map по List с помощью API Stream.filter() и forEach().

Исходный код на Github

Прокрутить вверх