java - Java lambda 交集两个列表并从结果中删除
问题描述
我想将 Java lambda 表达式用于两个列表的交集,然后再使用 lambda 表达式从列表中删除。
例子:我有
List<Person> first = new ArrayList<Person>();
List<Person> second = new ArrayList<Person>();
假设两个列表都有一些 Person 对象。我想将两个按名称过滤的列表的临时交集放入列表中,例如:
List<Person> temp = new ArrayList<>();
for (Person one : first) {
for (Person two : second) {
if(one.getName.equals(two.getName)) {
temp.add(two);
}
}
}
然后我想使用过滤器从临时中删除一些人,例如,使用姓氏。
for (Person tmp : temp) {
for (Person one : first) {
if (one.getSurname.equals(tmp.getSurname)) {
temp.remove(tmp);
}
}
}
我想使用 lambda 表达式,我该怎么做?
解决方案
你可以这样做,
Map<String, Set<String>> nameToSurname = second.stream().collect(
Collectors.groupingBy(Person::getName,
Collectors.mapping(Person::getSurname, Collectors.toSet())));
List<Person> temp = first.stream().
filter(p -> nameToSurname.containsKey(p.getName()))
.filter(p -> !nameToSurname.get(p.getName()).contains(p.getSurname()))
.collect(Collectors.toList());
首先使用第二个列表创建一个map
从 mame 到 all 的名称。surnames
然后遍历第一个列表,对于每个人,通过传递名称作为键来检查地图中是否存在值。如果是,则检查姓氏是否与当前人的姓氏相匹配。如果两个条件都满足,则将其收集到容器中。
推荐阅读
- php - 将 firebird/interbase 驱动程序连接到服务器时出现问题
- javascript - facebook 的 FB.api 是如何工作的?
- java - 如何将 SharedPreferences 类作为 DataManager 注入应用程序?
- iccube - 如何为父/子维度定义 PARENT_ID = NULL 或 PARENT_ID = ID 的根成员
- python - 如何在 python 2.7 中仅从邮件的有效负载中打印消息正文
- html - 如何对齐表格内容 HTML 表格
- php - Openssl_encrypt 使文本不适合通过 URL 中的 GET 发送到 php
- javascript - 如何在 Vue-CLI 3 项目中全局声明 jQuery?
- javascript - MongoClient.connect 函数返回未定义
- javascript - React-Native - 如何替换 react-native 核心组件的功能