Podczas omawiania sposobów konwertowania prymitywnych tablic na strumienie okazało się, że char[]
nie są one obsługiwane, podczas gdy obsługiwane są inne pierwotne typy tablic. Czy jest jakiś konkretny powód, aby pominąć je w strumieniu?
43
Odpowiedzi:
Jak powiedział Eran, nie tylko on zaginął.
A
BooleanStream
byłby bezużyteczny, aByteStream
(jeśli istniałby ) może być traktowany jakoInputStream
lub konwertowany naIntStream
(jak możeshort
) ifloat
może być obsługiwany jakoDoubleStream
.Ponieważ i
char
tak nie jest w stanie reprezentować wszystkich znaków (patrz link), byłby to nieco starszy strumień. Chociaż większość ludzi i tak nie musi mieć do czynienia ze współrzędnymi kodowymi, więc może się to wydawać dziwne. Mam na myśli, że używaszString.charAt()
bez myślenia „to nie działa we wszystkich przypadkach”.Dlatego niektóre rzeczy zostały pominięte, ponieważ nie uznano ich za tak ważne. Jak powiedział JB Nizet w powiązanym pytaniu :
Powód
BooleanStream
byłby bezużyteczny, ponieważ masz tylko 2 wartości, co znacznie ogranicza operacje. Nie trzeba wykonywać żadnych operacji matematycznych, a jak często pracujesz z wieloma wartościami logicznymi?źródło
BooleanStream
byłoby bezużyteczne”: dlaczego?reduce(Boolean::logicalAnd)
Lubreduce(Boolean::logicalOr)
naboolean[]
? W końcu metodylogicalAnd
ilogicalOr
zostały dodane w Javie 8, więc mogę wykonać te operacje redukcjiStream<Boolean>
… Nawiasem mówiąc, możesz przesyłać strumieniowochar[]
tak łatwoCharBuffer.wrap(array).chars()
lubCharBuffer.wrap(array).codePoints()
, w zależności od tego, który semantyczny preferujesz.Boolean::logicalAnd
, że istnieje, niekoniecznie gwarantuje istnienieBooleanStream
. Można ich jednak użyć w sytuacjach, w których lambda nie jest strumieniowe. Mogę sobie wyobrazić, że ktoś chce zrobićreduce(Boolean::logicalAnd)
, ale w żadnym wypadku nie będzie nikomu potrzebę , aby to zrobić.while (i < limit)
, ale w żadnym wypadku nikt nie musi tego robić [za pomocą instrukcji montażu oddziału i skoku]”<Primitive>Stream
dla którego nie ma każdego prymitywnego typu, jest to, że nadmiernie nadyma API. Prawidłowe pytanie, które należy zadać, brzmi „dlaczegoIntStream
w ogóle jest?” a niefortunną odpowiedzią jest to, że system typów Java nie jest wystarczająco rozbudowany, aby wyrazićStream<int>
bez całego wydatku związanego z wydajnościąInteger
. Gdyby Java miała typy wartości, które mogłyby być przypisane do stosu lub osadzone bezpośrednio w innych strukturach danych, nie byłoby takiej potrzeby poza niczym innymStream<T>
Oczywiście odpowiedź brzmi „ bo tak postanowili projektanci ”. Nie ma technicznego powodu, dla
CharStream
którego nie mógłby istnieć.Jeśli potrzebujesz uzasadnienia, zwykle musisz zmienić listę mailingową OpenJDK *. Dokumentacja JDK nie ma zwyczaju uzasadniać, dlaczego coś jest, dlaczego tak jest.
Ktoś zapytał
Odpowiedź Briana Goetza (architekta języka Java) mówi
Źródło
On również mówi to samo w innym miejscu
Źródło
TL; DR: Nie warte kosztów utrzymania.
* Jeśli jesteś ciekawy, użyłem zapytania Google
źródło
100K+ of JDK footprint
?To nie tylko
char
tablice nie są obsługiwane.Są tylko 3 rodzaje strumieni - prymitywnych
IntStream
,LongStream
iDoubleStream
.W efekcie,
Arrays
ma metody konwersjiint[]
,long[]
idouble[]
do odpowiednich pierwotnych strumieni.Brak odpowiednich metod
boolean[]
,byte[]
,short[]
,char[]
ifloat[]
, ponieważ te typy pierwotne nie ma odpowiedniego pierwotne strumienie.źródło
char
jest zależną częściąString
- przechowywania wartości UTF-16. Symbol Unicode, punkt kodowy , jest czasem zastępczą parą znaków. Tak więc każde proste rozwiązanie z znakami obejmuje tylko część domeny Unicode.Był czas, który
char
miał własne prawo do bycia typem publicznym. Ale w dzisiejszych czasach lepiej jest użyć punktów kodowych ,IntStream
. Strumień zwęglenia nie był w stanie bezpośrednio poradzić sobie z parami zastępczymi.Innym bardziej prozaicznym powodem jest to, że model „procesora” JVM używa
int
najmniejszego „rejestru”, utrzymując wartości logiczne, bajty, skróty, a także znaki w takiej wielkości pamięci. Aby niekoniecznie nadmuchać klasy Java, jedna powstrzymała się od wszystkich możliwych wariantów kopiowania.W dalekiej przyszłości można oczekiwać, że prymitywne typy będą mogły działać jako ogólne parametry parametrów, pod warunkiem, że
List<int>
. Wtedy możemy zobaczyćStream<char>
.Na razie lepiej unikać
char
, a może używaćjava.text.Normalizer
unikalnej kanonicznej formy punktów kodowych / ciągów znaków Unicode.źródło