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)
获得,其中p
是Person
)必须等于该键的值。