Научитесь фильтровать 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().