首页 > 解决方案 > 使用 inputMap 过滤列表(List1)中的数据(键和值可能因每个请求而异)

问题描述

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 是动态的。我们可能只得到城市或城市和邮政编码或在 Person 对象中定义的上述 5 个属性的任意组合)

我需要使用流过滤与 inputMap 匹配的人员列表。我尝试了使用java流的不同方法,但没有运气,请帮忙。

标签: javajava-stream

解决方案


您可以为每个可能的键应用过滤器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);
...

你可以写:

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)where pis the获得Person)必须等于该键的值。


推荐阅读