Java でストリームを使用して、特定のフィールドに基づいて 2 つのコレクションをフィルタリングし、重複を削除しますか?

Java でストリームを使用して、特定のフィールドに基づいて 2 つのコレクションをフィルタリングし、重複を削除しますか?

Java では、Stream を使用して 2 つのコレクションをフィルタリングし、重複を排除できます。以下は、オブジェクトのフィールドに基づいてフィルタリングおよび重複排除を行う方法を示すサンプル コードです。

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

public class Main {
    public static void main(String[] args) {
        // 创建一个对象集合
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Alice", 25));
        persons.add(new Person("Bob", 30));
        persons.add(new Person("Alice", 25));
        persons.add(new Person("Charlie", 35));
        persons.add(new Person("Alice", 40));
        persons.add(new Person("Bob", 25));

        // 根据 name 字段进行过滤和去重
        List<Person> filteredAndDistinctPersons = persons.stream()
                .filter(person -> person.getName().equals("Alice"))
                .distinct()
                .collect(Collectors.toList());

        // 打印结果
        filteredAndDistinctPersons.forEach(System.out::println);
    }
}

class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        returnPerson [name=" + name + ", age=" + age + "]";
    }
}

この例では、名前と年齢の 2 つのフィールドを含む人事情報を表す Person クラスを作成しました。ストリームの filter メソッドを使用して、名前フィールドが「Alice」であるオブジェクトをフィルターで除外し、distinct メソッドを使用して重複オブジェクトを削除します。最後に、collect メソッドを使用して結果を新しいコレクションに収集します。

サンプル コードを実行すると、次の出力が生成されます。

Person [name=Alice, age=25]
Person [name=Alice, age=40]

これら 2 つの結果は、名前フィールドが「Alice」であることに基づいてフィルタリングと重複排除を行った結果です。

現在 2 つのコレクション リストがあります。別のリストの属性フィールドに基づいてリストの重複を排除して、含まれない結果を生成するにはどうすればよいですか?

あるコレクション内の属性フィールドを含まない要素を、別のコレクションの属性フィールドに基づいて重複排除するには、Java 8 以降でストリーム操作とフィルター操作を使用できます。これを行う方法を示すサンプル コードを次に示します。

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

public class Main {
    public static void main(String[] args) {
        // 创建两个对象集合
        List<Person> list1 = new ArrayList<>();
        list1.add(new Person("Alice", 25));
        list1.add(new Person("Bob", 30));
        list1.add(new Person("Charlie", 35));

        List<Person> list2 = new ArrayList<>();
        list2.add(new Person("Alice", 25));
        list2.add(new Person("David", 40));
        list2.add(new Person("Eve", 45));

        // 根据 list2 中的 name 字段,将 list1 中不包含该字段的元素去重
        List<Person> distinctPersons = list1.stream()
                .filter(person -> list2.stream().noneMatch(p -> p.getName().equals(person.getName())))
                .distinct()
                .collect(Collectors.toList());

        // 打印结果
        distinctPersons.forEach(System.out::println);
    }
}

class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        returnPerson [name=" + name + ", age=" + age + "]";
    }
}

この例では、2 つのコレクション list1 と list2 を作成し、それぞれ 2 つのオブジェクト コレクションを表します。ストリームの filter メソッドを使用して、list2 の name フィールドを含まない list1 の要素を除外し、distinct メソッドを使用して重複を削除します。最後に、collect メソッドを使用して結果を新しいコレクションに収集します。

サンプル コードを実行すると、次の出力が生成されます。

Person [name=Bob, age=30]
Person [name=Charlie, age=35]

これら 2 つの結果は list2 の name フィールドに基づいており、このフィールドを含まない list1 の要素は重複排除されています。

おすすめ

転載: blog.csdn.net/weixin_50503886/article/details/132310147