Rumah > Java > javaTutorial > Bagaimana untuk Mengehadkan Strim Java 8 Sehingga Predikat Gagal?

Bagaimana untuk Mengehadkan Strim Java 8 Sehingga Predikat Gagal?

Barbara Streisand
Lepaskan: 2024-12-20 17:59:10
asal
639 orang telah melayarinya

How to Limit a Java 8 Stream Until a Predicate Fails?

Menghadkan Strim Berdasarkan Predikat dalam Java 8

Operasi strim Java 8 menyediakan cara yang berkuasa untuk memanipulasi dan menapis data. Walau bagaimanapun, ia tidak mempunyai operasi khusus untuk mengehadkan aliran yang berkemungkinan tidak terhingga sehingga elemen pertama gagal dalam predikat tertentu.

Dalam Java 9, operasi takeWhile boleh digunakan untuk mencapai gelagat ini. Sebagai contoh, untuk mencetak semua nombor kurang daripada 10 menggunakan takeWhile, anda boleh menulis:

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);
Salin selepas log masuk

Tetapi bagaimana pula dengan Java 8, di mana takeWhile tidak tersedia? Dalam kes ini, terdapat beberapa pendekatan untuk melaksanakan fungsi yang serupa.

Salah satu cara melibatkan penggunaan penapis dan operasi findFirst. Coretan kod berikut menunjukkan cara:

IntStream
    .iterate(1, n -> n + 1)
    .filter(n -> n < 10)
    .findFirst()
    .ifPresent(System.out::println);
Salin selepas log masuk

Penyelesaian ini berfungsi dengan menapis unsur-unsur yang tidak memenuhi predikat (dalam kes ini, nombor lebih besar daripada atau sama dengan 10) dan kemudian mencari elemen baki pertama dalam aliran itu. Jika tiada unsur sepadan ditemui, findFirst mengembalikan pilihan kosong, yang diabaikan dalam kes ini.

Pendekatan lain menggunakan kaedah Stream.limitUntil tersuai, yang mengambil predikat sebagai hujah. Berikut ialah contoh pelaksanaan:

public static <T> Stream<T> limitUntil(Stream<T> stream, Predicate<? super T> predicate) {
    AtomicBoolean stop = new AtomicBoolean(false);
    return stream.takeWhile(t -> {
        boolean stopFlag = stop.get();
        if (!stopFlag) stopFlag = predicate.test(t);
        stop.set(stopFlag);
        return !stopFlag;
    });
}
Salin selepas log masuk

Kaedah ini boleh digunakan seperti berikut:

IntStream
    .iterate(1, n -> n + 1)
    .limitUntil(n -> n >= 10)
    .forEach(System.out::println);
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengehadkan Strim Java 8 Sehingga Predikat Gagal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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