两个list如何根据一个list中的属性去过滤掉另一个list中不包含这部分的属性,用流实现

在这里插入图片描述

你可以使用Java 8的流来实现这个功能。假设你有两个包含对象的List,每个对象有一个属性,你想根据一个List中的属性值来过滤掉另一个List中不包含这个属性值的对象。下面是一种使用流的方式来实现这个功能

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class MyClass {
    private String property;

    public MyClass(String property) {
        this.property = property;
    }

    public String getProperty() {
        return property;
    }
}

public class Main {
    public static void main(String[] args) {
        List<MyClass> list1 = new ArrayList<>();
        list1.add(new MyClass("A"));
        list1.add(new MyClass("B"));
        list1.add(new MyClass("C"));
        
        List<String> list2 = new ArrayList<>();
        list2.add("A");
        list2.add("B");
        
        List<MyClass> filteredList = list1.stream()
                .filter(obj -> list2.contains(obj.getProperty()))
                .collect(Collectors.toList());

        filteredList.forEach(obj -> System.out.println(obj.getProperty()));
    }
}

在上面的例子中,我们有两个List:list1包含了MyClass对象,每个对象有一个属性property;list2包含了一些属性值。我们使用流来筛选list1中的对象,只保留那些property值在list2中存在的对象,最后将筛选后的结果收集到filteredList中。

输出的结果将会是:

A
B

这是根据list2中的属性值过滤掉了list1中不包含这部分属性的对象。你可以根据自己的实际需要修改代码,适应不同的数据类型和属性名称。

要是类中有很多属性那该怎么写?

如果类中有很多属性,你可以根据需要编写适合的筛选条件来过滤掉不符合要求的对象。下面是一个示例,演示了如何根据类中的多个属性进行过滤。

假设你有一个名为Person的类,该类有多个属性,包括name、age和gender。你想根据一组条件对Person对象进行过滤,这些条件包括age大于等于18,同时gender为"male"。下面是一个使用流的示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class Person {
    private String name;
    private int age;
    private String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getGender() {
        return gender;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Alice", 28, "female"));
        personList.add(new Person("Bob", 20, "male"));
        personList.add(new Person("Charlie", 25, "male"));
        personList.add(new Person("Diana", 16, "female"));

        List<Person> filteredList = personList.stream()
                .filter(person -> person.getAge() >= 18 && person.getGender().equals("male"))
                .collect(Collectors.toList());

        filteredList.forEach(person -> System.out.println(person.getName()));
    }
}

在上面的例子中,我们定义了一个Person类,该类有三个属性:name、age和gender。我们使用流的filter操作来对personList中的对象进行筛选,只保留那些满足age大于等于18并且gender为"male"的对象。最后,我们将筛选结果收集到filteredList中,并打印每个对象的name属性。

输出的结果将会是:

Bob
Charlie

这是根据定义的条件过滤掉了personList中不符合要求的Person对象。你可以根据自己的实际需求修改代码,添加或修改筛选条件,以适应不同的属性和值。

要是两个list中的元素对象存在多个属性。如何根据一个list中的对象的某个属性去过滤另一个集合元素?

如果两个集合中的元素对象有多个属性,并且你想要根据一个集合中的对象的某个属性值,来过滤另外一个集合中的元素,你可以使用流和条件谓词来实现。下面是一个示例代码,演示了如何根据一个集合中的对象的某个属性值,过滤另一个集合中的元素:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class Element {
    private int id;
    private String name;

    public Element(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Element> list1 = new ArrayList<>();
        list1.add(new Element(1, "A"));
        list1.add(new Element(2, "B"));
        list1.add(new Element(3, "C"));

        List<Element> list2 = new ArrayList<>();
        list2.add(new Element(1, "X"));
        list2.add(new Element(2, "Y"));
        list2.add(new Element(3, "Z"));

        List<Element> filteredList = list2.stream()
                .filter(obj -> list1.stream()
                        .map(Element::getId)
                        .collect(Collectors.toList())
                        .contains(obj.getId()))
                .collect(Collectors.toList());

        filteredList.forEach(obj -> System.out.println(obj.getName()));
    }
}

在上面的例子中,我们有两个集合list1和list2,每个集合包含了Element对象,每个对象有两个属性:id和name。我们使用流来筛选list2中的元素,只保留那些id值在list1中存在的元素,最后将筛选后的结果收集到filteredList中。

输出的结果将会是:

X
Y
Z

这是根据list1中元素的id属性值过滤掉了list2中不包含这部分属性的元素。你可以根据自己的实际需要修改代码,适应不同的数据类型和属性名称。

要是过滤后想保留集合中的整个对象如何书写?

如果你希望在过滤后保留集合中的整个对象,而不仅仅是属性值,你可以在过滤时使用 anyMatch() 方法来判断某个属性值是否存在于另一个集合中,然后将通过判断的对象保留下来。下面是一个示例代码:

import java.util.ArrayList;
import java.util.List;

class Element {
    private int id;
    private String name;

    public Element(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Element> list1 = new ArrayList<>();
        list1.add(new Element(1, "A"));
        list1.add(new Element(2, "B"));
        list1.add(new Element(3, "C"));

        List<Element> list2 = new ArrayList<>();
        list2.add(new Element(1, "X"));
        list2.add(new Element(2, "Y"));
        list2.add(new Element(3, "Z"));

        List<Element> filteredList = new ArrayList<>();

        for (Element obj2 : list2) {
            if (list1.stream().anyMatch(obj1 -> obj1.getId() == obj2.getId())) {
                filteredList.add(obj2);
            }
        }

        filteredList.forEach(obj -> System.out.println(obj.getName()));
    }
}

在上面的例子中,我们有两个集合 list1 和 list2,它们包含了 Element 对象并具有相应的属性。我们通过遍历 list2 中的元素,使用 anyMatch() 方法检查该元素的 id 属性是否存在于 list1 中的任意一个元素中。如果存在,则将该对象添加到 filteredList 集合中。最后,我们打印输出 filteredList 中的元素的 name 属性。

输出的结果将会是:

X
Y
Z

这样就根据 list1 中的对象的某个属性值过滤掉了 list2 中不包含这部分属性的元素,并保留了整个对象。你可以根据具体的需求修改代码以适应不同的数据类型和属性名称。

猜你喜欢

转载自blog.csdn.net/weixin_50503886/article/details/132310089