java - 使用 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流的不同方法,但没有运气,请帮忙。
解决方案
您可以为每个可能的键应用过滤器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 p
is the获得Person
)必须等于该键的值。
推荐阅读
- python - 如何替换网格中的对角线条目
- qt - 在主窗口 PyQt5 中打开窗口
- gitlab - gitlab-runner & fastlane - 找不到 OneSignal 扩展配置文件
- parsley.js - Parsley 错误消息中的变量未更新
- python-3.x - Python3,如何正确编码这个字符串?
- java - j = i + 1 和 j = ++i 之间的差异;
- javascript - 有一些 CSS 问题
- regex - 在 Chrome 中,最终使用带有正则表达式的重定向扩展,如何将所有 facebook.com URL 重定向到 mbasic.facebook.com URL
- javascript - 检测泛型类型参数是否具有 id 属性?
- javascript - 将常规文本输入转换为 DD/MM/YYYY 格式