首页 > 解决方案 > 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 表达式,我该怎么做?

标签: javalistlambdajava-8java-stream

解决方案


你可以这样做,

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然后遍历第一个列表,对于每个人,通过传递名称作为键来检查地图中是否存在值。如果是,则检查姓氏是否与当前人的姓氏相匹配。如果两个条件都满足,则将其收集到容器中。


推荐阅读