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是动态的。我们可能只获得city或city&zipCode或Person对象中定义的以上5个属性的任意组合)

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

最佳答案

您可以为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)获得,其中pPerson)必须等于该键的值。

10-08 14:28