İlkel dizileri Akışlara dönüştürme yollarını char[]
izlerken, diğer ilkel dizi türleri desteklenirken desteklenmediğini buldum . Onları akışta bırakmak için özel bir neden var mı?
İlkel dizileri Akışlara dönüştürme yollarını char[]
izlerken, diğer ilkel dizi türleri desteklenirken desteklenmediğini buldum . Onları akışta bırakmak için özel bir neden var mı?
Yanıtlar:
Eran'ın dediği gibi, kayıp olan tek kişi bu değil.
A BooleanStream
işe yaramaz olurdu, ByteStream
(eğer varsa) bir olarak ele alınabilir InputStream
veya IntStream
(olabildiğince short
) dönüştürülebilir ve bir float
olarak ele alınabilir DoubleStream
.
As char
(bağlantılı bakınız) zaten tüm karakterleri temsil etmek mümkün değildir, bu bir olurdu biraz eski akışının. Her ne kadar çoğu insan kod noktalarıyla uğraşmak zorunda olmasa da, garip görünebilir. Demek istediğim, String.charAt()
"bu aslında her durumda işe yaramaz" diye düşünmeden kullanırsınız .
Bu yüzden bazı şeyler dışarıda bırakıldı çünkü o kadar önemli sayılmadılar. Bağlantılı soruda JB Nizet'in söylediği gibi :
Tasarımcılar, ilkel akışları 3 tiple sınırlayarak sınıfların ve yöntemlerin patlamasından kaçınmayı seçti, çünkü diğer türler (char, kısa, şamandıra), önemli bir performans cezası olmadan daha büyük eşdeğerleri (int, double) ile temsil edilebilir.
Nedeni BooleanStream
işe yaramaz olurdu, çünkü sadece 2 değeriniz var ve bu işlemleri çok sınırlıyor. Yapılacak hiçbir matematiksel işlem yok ve ne kadar sıklıkla boole değerleri ile çalışıyorsunuz?
BooleanStream
işe yaramaz olur": neden?
reduce(Boolean::logicalAnd)
yoksa reduce(Boolean::logicalOr)
bir on, boolean[]
? Sonuçta, yöntemler logicalAnd
ve logicalOr
Java 8 eklenmiştir, bu yüzden bu azaltma işlemleri yapabilirim Stream<Boolean>
… Bu arada, hangi semantik tercih bağlı char[]
olarak CharBuffer.wrap(array).chars()
veya kadar kolay akış yapabilirsiniz CharBuffer.wrap(array).codePoints()
.
Boolean::logicalAnd
var olduğu için a'nın varlığını garanti etmek zorunda değildir BooleanStream
. Her şeyden önce bunlar akış olmayan lambda durumlarında kullanılabilir. Birisinin yapmak isteyeceğini hayal edebilirim reduce(Boolean::logicalAnd)
, ancak hiçbir durumda kimsenin bunu yapmasına gerek yoktur.
while (i < limit)
, ama hiçbir durumda herkes yapar ihtiyacını [dalı kullanılmasına göre ve montaj talimatları atlamak] bunu yapmak için"
<Primitive>Stream
her ilkel tip için tek neden yok , çünkü API'yı çok fazla şişirecek. Sorulması gereken doğru soru, "neden orada IntStream
, hiç?" ve talihsiz cevap, Java'nın tip sisteminin, Stream<int>
tüm performans harcamaları olmadan ifade edilebilecek kadar etli olmamasıdır Integer
. Java yığın tahsis veya in-line diğer veri yapıları içinde doğrudan gömmek olabilir değer türlerini olsaydı, yanında herhangi bir şey için böyle bir ihtiyaç olmazdıStream<T>
Tabii ki, cevap " çünkü tasarımcıların karar verdiği şey budur ". Var CharStream
olmamanın teknik bir nedeni yoktur.
Gerekçe göstermek istiyorsanız, genellikle OpenJDK posta listesini * çevirmeniz gerekir. JDK'nın belgeleri neden bir şeyin neden olduğunu açıklamak gibi bir alışkanlığa sahip değildir .
Birisi sordu
Char / byte akışını temsil etmek için IntStream kullanmak biraz zahmetlidir. CharStream ve ByteStream'i de eklemeli miyiz?
Brian Goetz'den (Java Language Architect) cevap
Kısa cevap: hayır.
Neredeyse hiç kullanılmayan bu formlar için, her biri için 100K + JDK ayak izi değmez. Bunları eklersek, biri kısa, şamandıra veya boole ister.
Başka bir deyişle, eğer insanlar tüm ilkel uzmanlıklara sahip olduğumuzda ısrar ederse, ilkel uzmanlıklarımız olmazdı. Hangi statüko daha kötü olurdu.
Aynı şeyi başka bir yerde de söylüyor
Onlarla karakter olarak uğraşmak istiyorsanız, onları kolayca karakterlere sürdürebilirsiniz. Bir bütün 'akarsular' kümesi için yeterince önemli bir kullanım durumu gibi görünmüyor. (Short, Byte, Float ile aynı).
TL; DR: Bakım maliyetine değmez.
* Merak ediyorsanız, kullandığım google sorgusu
site:http://mail.openjdk.java.net/ charstream
100K+ of JDK footprint
mi?
Sadece char
desteklenmeyen diziler değil.
Orada ilkel akımların sadece 3 türleri - IntStream
, LongStream
ve DoubleStream
.
Bunun bir sonucu olarak, Arrays
dönüştürme yöntemleri vardır int[]
, long[]
ve double[]
karşılık gelen ilk akışlarına.
Karşılık gelen bir yöntem vardır boolean[]
, byte[]
, short[]
, char[]
ve float[]
bu basit türleri ilkel akışları karşılık gelen yana.
char
String
UTF-16 değerlerinin saklanmasının bağımlı bir parçasıdır . Bir Unicode sembolü, bir kod noktası , bazen vekil bir çift karakterdir. Bu nedenle, karakter içeren herhangi bir basit çözüm, Unicode etki alanının yalnızca bir kısmını kapsar.
char
Kamusal bir tür olma hakkı olan bir zaman vardı. Ancak günümüzde kullanmak daha iyidir kod noktalarını bir, IntStream
. Bir char akışı, vekil çiftleri doğrudan işleyemedi.
Diğer daha belirgin neden, JVM "işlemci" modelinin int
boolean, bayt, şort ve karakterleri bu kadar büyük bir depolama yerinde tutması gibi en küçük bir "kayıt" kullanmasıdır. Java sınıflarını şişirmemek için, olası tüm kopya varyantlarından kaçınıldı.
Gelen uzak gelecekteki biri bir sağlayarak, genel tür parametre olarak işleve izin ilkel türleri bekleyebilir List<int>
. O zaman a Stream<char>
.
Şu an için daha iyi kaçının char
ve belki de java.text.Normalizer
kod noktaları / Unicode dizelerinin benzersiz bir kanonik formu için kullanın .