


Mengapakah `filter()` Nampak Tidak Malas Selepas `flatMap()` dalam Java Streams?
Mengapa filter() tidak "Sepenuhnya" Malas selepas flatMap() dalam Java Streams?
Dalam Java 8 strim, operasi perantaraan seperti filter() dan flatMap() adalah malas, bermakna mereka tidak melaksanakan sehingga operasi terminal seperti findFirst() dipanggil. Walau bagaimanapun, apabila filter() mengikut flatMap(), kemalasan ini tidak disedari sepenuhnya, membawa kepada tingkah laku yang tidak dijangka.
Pertimbangkan contoh kod ini:
Stream.of(1, 2, 3) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get();
Output menunjukkan bahawa hanya yang pertama elemen dicetak, menunjukkan bahawa penapis() malas dan litar pintas apabila syarat dipenuhi. Sebaliknya:
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();
Anehnya, semua elemen dicetak. Walaupun penapis() memenuhi syaratnya serta-merta, ia terus memproses elemen strim berikutnya.
Alasannya
Gelagat ini disebabkan oleh pelaksanaan Java Stream. Selepas flatMap(), strim tidak lagi mengandungi elemen asal. Sebaliknya, ia mengandungi jujukan elemen diratakan yang dihasilkan oleh flatMap(). Apabila penapis() mengikuti, ia beroperasi pada elemen diratakan ini, bukan strim asal.
Pelaksanaan forEachWithCancel(), yang digunakan dalam findFirst(), terus memanggil tryAdvance() pada pembahagi sehingga sinki meminta pembatalan atau pembahagi habis. Dalam kes flatMap(), spliterator terus maju tanpa sebarang kemungkinan penamatan awal, walaupun filter() telah menemui padanan.
Betulkan
Isu ini telah ditangani dalam Java 10 dan backported ke Java 8. Pelaksanaan kini membenarkan penamatan awal dalam flatMap() apabila operasi litar pintas seperti filter() digunakan.
Kesimpulan
Maklumlah, boleh mengelirukan mengapa filter() berkelakuan seolah-olah tidak malas selepas flatMap(). Pelaksanaan Java Streams yang mendasari menentukan tingkah laku ini, yang kemudiannya ditangani dalam Java 10 dan disandarkan kepada Java 8. Pemahaman ini penting untuk mengendalikan senario sedemikian dengan cekap.
Atas ialah kandungan terperinci Mengapakah `filter()` Nampak Tidak Malas Selepas `flatMap()` dalam Java Streams?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)

Javaisgreatduetoitsplatformindantrect, robustoopsupport, extensivelibraries, andstrongcommunity.1) platformindependenceviajvmallowscodetorunonvariousplatforms.2)

Lima ciri utama Java adalah polimorfisme, ekspresi lambda, streamsapi, generik dan pengendalian pengecualian. 1. Polimorfisme membolehkan objek kelas yang berbeza digunakan sebagai objek kelas asas biasa. 2. Ekspresi Lambda menjadikan kod lebih ringkas, terutama sesuai untuk mengendalikan koleksi dan aliran. 3.StreamsAPI dengan cekap memproses set data yang besar dan menyokong operasi deklaratif. 4. Generik menyediakan jenis keselamatan dan kebolehgunaan semula, dan kesilapan jenis ditangkap semasa penyusunan. 5. Pengendalian Pengecualian membantu mengendalikan kesilapan dengan elegan dan menulis perisian yang boleh dipercayai.

Java'stopfeaturessignificantelyedhanceitsperformanceAndscalability.1) Objek-OrientedPrincipleslikePolymorphismenableFlexiBleyDscalableCode.2)

Komponen teras JVM termasuk ClassLoader, Runtimedataarea dan ExecutionEngine. 1) Pemuat kelas bertanggungjawab untuk memuatkan, menghubungkan dan memulakan kelas dan antara muka. 2) Runtimedataarea mengandungi Methodarea, Heap, Stack, Pcregister dan Nativemethodstacks. 3) ExecutionEngine terdiri daripada penterjemah, Jitcompiler dan GarbageCollector, yang bertanggungjawab untuk pelaksanaan dan pengoptimuman bytecode.

Java'sSafetyandSecurityArebolsteredby: 1) Strongtyping, whichPreventStype-RelatedErrors; 2) AutomaticMemoryManagementViagriageGecollection, reducingMemory-RelatedVulnerabilities;

JavaoffersSeveralkeyfeaturesthatenHanceCodingsKills: 1) Objek-OrientedProgrammingallowSmodelingReal-Worldentities, exemplifiedBypolymorphism.2) ExceptleHandlingProvidesRobusRrormAragement.3)

TheJvmisacrucialComponentthatrunsjavacodeByTranslatingitintomachine-specificinstructions, impak, keselamatan, andporability.1) theclassloaderloads, pautan, andinitializesclasses.2)


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Versi Mac WebStorm
Alat pembangunan JavaScript yang berguna

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).
