java—使用inputmap筛选列表(list1)中的数据(每个请求的键和值可能不同)

biswetbf  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(248)
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”);

我将从数据库中获取人员列表,下面的Map是输入(这个输入Map是动态的。我们可能只得到city或city&zipcode或person对象中定义的上述5个属性的任意组合)
我需要使用流过滤与inputmap匹配的人员列表。我尝试了不同的方式使用java流,但没有运气,请帮助。

nr9pn0ug

nr9pn0ug1#

可以为中每个可能的键应用筛选器 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 将键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) 哪里 pPerson )必须等于该键的值。

相关问题