ホームページ >Java >&#&チュートリアル >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 つの製品を検出した場合、最初の製品のみが保持されます。
出力: 固有の製品のリストを取得します。
簡略化された理解
distinct() は値を直接比較することで重複を削除します。
例: [1, 2, 2, 3] は [1, 2, 3] になります。
クラスには、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 サイトの他の関連記事を参照してください。