Java Stream.distinct()

Mary-Kate Olsen
リリース: 2024-11-26 15:09:09
オリジナル
886 人が閲覧しました

Java Stream.distinct()

Java の Stream.distinct() メソッドは、ストリームから重複要素をフィルタリングして除外し、結果のストリームに一意の要素のみが含まれるようにするために使用されます。これは、ストリーム内のオブジェクトの equals() メソッドに基づいて機能します。

このメソッドは Java 8 で導入された Java Stream API の一部であり、重複した値を持つコレクションまたは配列を処理するために一般的に使用されます。

例 1: 文字列のリストから重複を削除する

名前のリストがあり、いくつかの名前が繰り返されていると想像してください。一意の名前のリストが必要です。

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

public class Main {
    public static void main(String[] args) {
        // List of names with duplicates
        List<String> names = List.of("Alice", "Bob", "Alice", "Charlie", "Bob", "David");

        // Use Stream.distinct() to remove duplicates
        List<String> uniqueNames = names.stream()
                                        .distinct()
                                        .collect(Collectors.toList());

        System.out.println(uniqueNames);
        // Output: [Alice, Bob, Charlie, David]
    }
}

ログイン後にコピー

仕組み:

distinct() メソッドは各名前を比較し、最初に出現した重複のみを保持します。

例 2: 数値のリストから重複を削除する
重複が存在する番号のリストを取得し、一意の番号のみを抽出しましょう。

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

public class Main {
    public static void main(String[] args) {
        // List of numbers with duplicates
        List<Integer> numbers = List.of(1, 2, 3, 2, 4, 3, 5);

        // Use Stream.distinct() to remove duplicates
        List<Integer> uniqueNumbers = numbers.stream()
                                             .distinct()
                                             .collect(Collectors.toList());

        System.out.println(uniqueNumbers);
        // Output: [1, 2, 3, 4, 5]
    }
}

ログイン後にコピー

仕組み:

数値は自然な等価性 (Integer のquals() に基づく) を使用して比較されるため、重複はフィルターで除外されます。

例 3: 単純なオブジェクトの操作
Product クラスを作成し、製品の ID に基づいて重複を削除しましょう。

コード:

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

class Product {
    private int id;
    private String name;

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return id == product.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "Product{id=" + id + ", name='" + name + "'}";
    }
}

public class Main {
    public static void main(String[] args) {
        // List of products with duplicates (based on id)
        List<Product> products = List.of(
            new Product(1, "Laptop"),
            new Product(2, "Tablet"),
            new Product(1, "Laptop"), // Duplicate
            new Product(3, "Smartphone"),
            new Product(2, "Tablet")  // Duplicate
        );

        // Use Stream.distinct() to remove duplicates
        List<Product> uniqueProducts = products.stream()
                                               .distinct()
                                               .collect(Collectors.toList());

        System.out.println(uniqueProducts);
        // Output:
        // [Product{id=1, name='Laptop'}, Product{id=2, name='Tablet'}, Product{id=3, name='Smartphone'}]
    }
}

ログイン後にコピー

説明:

等価チェック: 製品オブジェクトが ID に基づいて等しいとみなされるようにするために、equals() メソッドがオーバーライドされます。

重複の削除:distinct() が同じ ID を持つ 2 つの製品を検出した場合、最初の製品のみが保持されます。

出力: 固有の製品のリストを取得します。

簡略化された理解

  1. プリミティブまたは単純なオブジェクト (整数、文字列など) の場合:

distinct() は値を直接比較することで重複を削除します。

例: [1, 2, 2, 3] は [1, 2, 3] になります。

  1. カスタムオブジェクトの場合:

クラスには、equals() メソッドと hashCode() メソッドを実装する必要があります。

distinct() は、これらのメソッドを使用して 2 つのオブジェクトが重複しているかどうかを判断します。

ユースケース: ユーザー入力から重複する名前をフィルタリングする
ユーザーがフォームに名前を繰り返し入力する場合、一意の名前のみが保存されるようにしたいとします。

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

public class Main {
    public static void main(String[] args) {
        // Simulate user input
        List<String> userInput = new ArrayList<>();
        userInput.add("John");
        userInput.add("Mary");
        userInput.add("John"); // Duplicate
        userInput.add("Alice");

        // Remove duplicates
        List<String> uniqueInput = userInput.stream()
                                            .distinct()
                                            .collect(Collectors.toList());

        System.out.println(uniqueInput); // Output: [John, Mary, Alice]
    }
}

ログイン後にコピー

これにより、アプリケーションは重複の手動チェックを必要とせずに、一意の名前のみを保存することが保証されます。

最終的なポイント:

distinct() は単純です。ストリームから重複を削除します。

プリミティブまたは不変型の場合: 直接使用してください。

カスタム オブジェクトの場合:equals() と hashCode() が適切に実装されていることを確認します。

実践的なヒント: あらゆる形式 (リスト、ユーザー入力、データベース結果など) の重複データをクリーンアップするために使用します。

以上がJava Stream.distinct()の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート