Вы можете применить фильтр для каждого возможного ключа в Map
(т.е. вам потребуется 5 filter
операций):
List<Person> input = ...
List<Person> filtered = input.stream()
.filter(p -> !inputMap.containsKey("name") || p.getName().equals(inputMap.get("name")))
.filter(p -> !inputMap.containsKey("city") || p.getCity().equals(inputMap.get("city")))
...
.collect(Collectors.toList());
Если вы хотите обобщить это для произвольного числа Map
ключей, вам понадобится еще один Map
, который сопоставляет ключи с соответствующими свойствами Person
.
Например, если у вас есть:
Map<String,Function<Person,Object>> propMap = new HashMap<>();
propMap.put ("name",Person::getName);
propMap.put ("city",Person::getCity);
...
You мог написать:
List<Person> filtered = input.stream()
.filter(p -> inputMap.entrySet()
.stream()
.allMatch(e -> propMap.get(e.getKey()).apply(p).equals(e.getValue())))
.collect(Collectors.toList());
Это означает, что для каждого ключа inputMap
соответствующее свойство экземпляра Person
(которое получается через propMap.get(key).apply(p)
, где p
является Person
) должно быть равно значению этого ключа.