Sementara melalui cara-cara mengubah array primitif ke Streams, saya menemukan bahwa char[]tidak didukung sementara tipe array primitif lainnya didukung. Adakah alasan khusus untuk meninggalkan mereka di arus?
Sementara melalui cara-cara mengubah array primitif ke Streams, saya menemukan bahwa char[]tidak didukung sementara tipe array primitif lainnya didukung. Adakah alasan khusus untuk meninggalkan mereka di arus?
Jawaban:
Seperti yang dikatakan Eran, itu bukan satu-satunya yang hilang.
A BooleanStreamtidak akan berguna, a ByteStream(jika ada) dapat ditangani sebagai InputStreamatau diubah menjadi IntStream(as can short), dan floatdapat ditangani sebagai a DoubleStream.
Karena chartidak dapat mewakili semua karakter (lihat ditautkan), itu akan menjadi sedikit aliran warisan. Meskipun kebanyakan orang tidak harus berurusan dengan codepoint, jadi itu bisa terasa aneh. Maksud saya Anda menggunakan String.charAt()tanpa berpikir "ini sebenarnya tidak bekerja dalam semua kasus".
Jadi beberapa hal ditinggalkan karena tidak dianggap penting. Seperti yang dikatakan oleh JB Nizet dalam pertanyaan terkait :
Para desainer secara eksplisit memilih untuk menghindari ledakan kelas dan metode dengan membatasi aliran primitif menjadi 3 jenis, karena jenis lainnya (char, short, float) dapat diwakili oleh padanannya yang lebih besar (int, dobel) tanpa penalti kinerja yang signifikan.
Alasannya BooleanStreamakan sia-sia, adalah karena Anda hanya memiliki 2 nilai dan itu membatasi banyak operasi. Tidak ada operasi matematika untuk dilakukan, dan seberapa sering Anda bekerja dengan banyak nilai boolean?
BooleanStreamakan sia-sia": mengapa?
reduce(Boolean::logicalAnd)atau reduce(Boolean::logicalOr), pada boolean[]? Lagi pula, metode logicalAnddan logicalOrtelah ditambahkan di Java 8, jadi saya bisa melakukan operasi pengurangan ini dari Stream<Boolean>... Omong-omong, Anda dapat streaming melalui char[]semudah CharBuffer.wrap(array).chars()atau CharBuffer.wrap(array).codePoints(), tergantung semantik yang Anda inginkan.
Boolean::logicalAndada, itu tidak selalu menjamin adanya a BooleanStream. Bagaimanapun, itu dapat digunakan dalam situasi lambda non-stream. Saya dapat membayangkan bahwa seseorang ingin melakukannya reduce(Boolean::logicalAnd), tetapi tidak ada orang yang perlu melakukannya.
while (i < limit), tetapi tidak ada orang yang perlu melakukannya [menggunakan instruksi cabang dan lompat perakitan]"
<Primitive>Streamuntuk setiap jenis primitif adalah karena itu akan terlalu banyak mengasapi API. Pertanyaan yang benar untuk ditanyakan adalah "mengapa ada IntStream?" dan jawaban yang tidak menguntungkan adalah karena sistem tipe Java tidak cukup untuk mengekspresikan Stream<int>tanpa semua biaya kinerja menggunakan Integer. Jika Java memiliki tipe nilai, yang dapat dialokasikan pada stack atau menanamkan secara langsung in-line dalam struktur data lain, tidak akan ada kebutuhan seperti itu untuk apa pun selainStream<T>
Tentu saja, jawabannya adalah " karena itulah yang diputuskan oleh desainer ". Tidak ada alasan teknis mengapa CharStreamtidak ada.
Jika Anda ingin pembenaran, Anda biasanya perlu mengaktifkan milis OpenJDK *. Dokumentasi JDK bukanlah kebiasaan untuk membenarkan mengapa ada sesuatu yang menyebabkannya.
Seseorang bertanya
Menggunakan IntStream untuk mewakili aliran char / byte sedikit merepotkan. Haruskah kita menambahkan CharStream dan ByteStream juga?
Jawaban dari Brian Goetz (Arsitek Bahasa Jawa) mengatakan
Jawaban singkat: tidak.
Tidak perlu lagi 100K + jejak JDK untuk masing-masing bentuk yang hampir tidak pernah digunakan. Dan jika kita menambahkannya, seseorang akan meminta short, float, atau boolean.
Dengan kata lain, jika orang bersikeras kita memiliki semua spesialisasi primitif, kita tidak akan memiliki spesialisasi primitif. Yang akan lebih buruk daripada status quo.
Dia juga mengatakan hal yang sama di tempat lain
Jika Anda ingin mengatasinya sebagai chars, Anda dapat dengan mudah menurunkannya menjadi chars. Tampaknya bukan kasus penggunaan yang cukup penting untuk memiliki rangkaian aliran nother keseluruhan. (Sama dengan Short, Byte, Float).
TL; DR: Tidak sebanding dengan biaya perawatan.
* Jika Anda penasaran, kueri google yang saya gunakan adalah
site:http://mail.openjdk.java.net/ charstream
100K+ of JDK footprint?
Bukan hanya chararray yang tidak didukung.
Hanya ada 3 jenis aliran primitif - IntStream, LongStreamdan DoubleStream.
Akibatnya, Arraysmemiliki metode yang mengkonversi int[], long[]dan double[]ke aliran primitif yang sesuai.
Tidak ada metode yang sesuai untuk boolean[], byte[], short[], char[]dan float[], karena ini jenis primitif telah ada sesuai primitif sungai.
charadalah bagian dependen dari String- menyimpan nilai UTF-16. Simbol Unicode, titik kode , terkadang merupakan pasangan pengganti karakter. Jadi setiap solusi sederhana dengan karakter hanya mencakup sebagian dari domain Unicode.
Ada waktu yang charmemiliki hak sendiri untuk menjadi tipe publik. Tetapi saat ini lebih baik menggunakan poin kode , sebuah IntStream. Aliran arang tidak bisa langsung menangani pasangan pengganti.
Alasan lain yang lebih umum adalah bahwa model "prosesor" JVM menggunakan int"register" terkecil, menjaga boolean, byte, celana pendek dan juga karakter di lokasi penyimpanan berukuran int. Untuk tidak selalu mengasapi kelas java, satu menahan diri dari semua varian salinan yang mungkin.
Di masa depan yang jauh mungkin mengharapkan tipe primitif diizinkan berfungsi sebagai parameter tipe generik, memberikan a List<int>. Maka kita mungkin melihat Stream<char>.
Untuk saat ini sebaiknya hindari char, dan mungkin gunakan java.text.Normalizeruntuk bentuk kanonik unik dari poin kode / string Unicode.