Rumah > Java > javaTutorial > Mengapakah `filter()` Java Stream Selepas `flatMap()` Kadangkala Hilang Kemalasan?

Mengapakah `filter()` Java Stream Selepas `flatMap()` Kadangkala Hilang Kemalasan?

Patricia Arquette
Lepaskan: 2024-12-28 12:52:13
asal
612 orang telah melayarinya

Why Does Java Stream's `filter()` After `flatMap()` Sometimes Lose Laziness?

Penapis Java Stream Selepas FlatMap Tidak Sepenuhnya Malas

Strim Java menyediakan cara untuk memproses saluran paip data melalui urutan transformasi. Operasi perantaraan biasanya malas, bermakna ia tidak dilaksanakan sehingga operasi terminal dipanggil. Walau bagaimanapun, telah diperhatikan bahawa penggunaan filter() selepas flatMap() dalam senario tertentu boleh membawa kepada tingkah laku tidak malas.

Kod Contoh

Pertimbangkan perkara berikut kod:

System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);
System.out.println("-----------");
System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);
Salin selepas log masuk

Output

1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1
Salin selepas log masuk

Penjelasan

Dalam kes pertama, operasi penapisan digunakan sebelum flatMap(), mengakibatkan penilaian malas. Penilaian berhenti pada elemen padanan pertama (1).

Dalam kes kedua, operasi flatMap() mencipta aliran baharu sembilan elemen (-1, 0, 1, 0, 1, 2, 1 , 2, 3). Operasi penapis() seterusnya digunakan pada setiap elemen ini, menyebabkan tingkah laku tidak malas. Walaupun menemui elemen padanan (-1), penilaian terus memproses semua elemen dalam strim.

Betulkan

Isu ini telah ditangani dalam JDK-8075939 dan ditetapkan dalam Java 10. Ia telah dibackport ke Java 8 in JDK-8225328.

Pembetulan memastikan penilaian malas dikekalkan dengan kehadiran kedua-dua operasi flatMap() dan penapis(). Ini bermakna penilaian kini akan ditamatkan sebaik sahaja elemen padanan ditemui.

Implikasi

Pembetulan ini menyelesaikan isu yang boleh timbul daripada tingkah laku tidak malas apabila menggunakan flatMap() dan filter(). Ia meningkatkan prestasi dan ketepatan saluran paip aliran dalam kes di mana penamatan awal dijangkakan.

Atas ialah kandungan terperinci Mengapakah `filter()` Java Stream Selepas `flatMap()` Kadangkala Hilang Kemalasan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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