Rumah > Java > javaTutorial > Java Stream.distinct()

Java Stream.distinct()

Mary-Kate Olsen
Lepaskan: 2024-11-26 15:09:09
asal
871 orang telah melayarinya

Java Stream.distinct()

Kaedah Stream.distinct() dalam Java digunakan untuk menapis unsur pendua daripada strim, memastikan strim yang terhasil hanya mengandungi unsur unik. Ia berfungsi berdasarkan kaedah equals() bagi objek dalam strim.

Kaedah ini adalah sebahagian daripada Java Stream API yang diperkenalkan dalam Java 8 dan biasanya digunakan untuk mengendalikan koleksi atau tatasusunan dengan nilai pendua.

Contoh 1: Mengalih keluar Pendua daripada Senarai Rentetan

Bayangkan anda mempunyai senarai nama, dan beberapa nama diulang. Anda mahukan senarai nama unik.

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]
    }
}

Salin selepas log masuk

Cara ia berfungsi:

Kaedah distinct() membandingkan setiap nama dan hanya menyimpan kejadian pertama pendua.

Contoh 2: Mengalih keluar Pendua daripada Senarai Nombor
Mari kita ambil senarai nombor yang wujud pendua dan keluarkan nombor unik sahaja.

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]
    }
}

Salin selepas log masuk

Cara ia berfungsi:

Nombor tersebut dibandingkan menggunakan kesamaan semula jadinya (berdasarkan equals() untuk Integer), jadi pendua ditapis keluar.

Contoh 3: Bekerja dengan Objek Mudah
Mari buat Produk kelas dan alih keluar pendua berdasarkan id produk.

Kod:

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'}]
    }
}

Salin selepas log masuk

Penjelasan:

Semakan Kesamaan: Kaedah equals() ditindih untuk memastikan objek Produk dianggap sama berdasarkan idnya.

Penyingkiran Pendua: Apabila distinct() menemui dua produk dengan id yang sama, ia hanya menyimpan yang pertama.

Output: Anda mendapat senarai produk unik.

Pemahaman Ringkas

  1. Untuk Objek Primitif atau Mudah (seperti Integer, Rentetan):

distinct() mengalih keluar pendua dengan membandingkan nilai secara terus.

Contoh: [1, 2, 2, 3] menjadi [1, 2, 3].

  1. Untuk Objek Tersuai:

Anda perlu melaksanakan kaedah equals() dan hashCode() untuk kelas.

distinct() menggunakan kaedah ini untuk menentukan sama ada dua objek adalah pendua.

Kes Penggunaan: Menapis Nama Pendua daripada Input Pengguna
Bayangkan pengguna memasukkan nama berulang kali dalam borang dan anda mahu memastikan hanya nama unik disimpan.

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]
    }
}

Salin selepas log masuk

Ini memastikan bahawa aplikasi hanya menyimpan nama unik tanpa memerlukan semakan manual untuk pendua.

Pengambilan Akhir:

distinct() adalah mudah: ia mengalih keluar pendua daripada strim.

Untuk jenis primitif atau tidak boleh ubah: Hanya gunakan terus.

Untuk objek tersuai: Pastikan pelaksanaan equals() dan hashCode() yang betul.

Petua Praktikal: Gunakannya untuk membersihkan data pendua dalam sebarang bentuk (cth., senarai, input pengguna, hasil pangkalan data).

Atas ialah kandungan terperinci Java Stream.distinct(). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan