Фильтрация данных в списке (List1) с использованием inputMap (ключ и значения могут различаться для каждого запроса) - PullRequest
0 голосов
/ 24 января 2020
class Person
{
    private String name;
    private String birthDate;
    private String city;
    private String state;
    private int zipCode;    
}

Map<String, String> inputMap = new HashMap<>();
inputMap.put(“name”, “David”);

Map<String, String> inputMap1 = new HashMap<>();
inputMap1.put(“name”, “David”);
inputMap1.put(“city”, “Auburn”);

Я получу список людей из БД, и ниже карта является входной (это inputMap - Dynami c. Мы можем получить только city или city & zipCode или любую комбинацию из 5 вышеуказанных свойств, определенных в Person объект)

Мне нужно отфильтровать список лиц, соответствующих inputMap, используя потоки. Я пробовал разные способы, используя java stream, но не повезло, пожалуйста, помогите.

1 Ответ

0 голосов
/ 24 января 2020

Вы можете применить фильтр для каждого возможного ключа в 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) должно быть равно значению этого ключа.

...