Arrays.stream () tarafından desteklenmeyen tek diziler neden char []?


Yanıtlar:


31

Eran'ın dediği gibi, kayıp olan tek kişi bu değil.

A BooleanStreamişe yaramaz olurdu, ByteStream(eğer varsa) bir olarak ele alınabilir InputStreamveya IntStream(olabildiğince short) dönüştürülebilir ve bir floatolarak 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 BooleanStreamiş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?


7
"A BooleanStreamişe yaramaz olur": neden?
glglgl

12
O, yapılacak örneğin ihtiyacı olabilir birisini varsaymak gerçekten mantıksız mı reduce(Boolean::logicalAnd)yoksa reduce(Boolean::logicalOr)bir on, boolean[]? Sonuçta, yöntemler logicalAndve logicalOrJava 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().
Holger

2
@Holger sadece Boolean::logicalAndvar 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.
Kayaman

4
Hangi argümanı yapmaya çalıştığınızı göremiyorum. Onun aşırı formda: "Bunu kimse tahmin edebilirsiniz yapmak isteyeyim ediyorum 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"
eski durumuna Monica - İskender

11
Bana öyle geliyor ki <Primitive>Streamher 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>
Reinstate Monica - İskender

32

Tabii ki, cevap " çünkü tasarımcıların karar verdiği şey budur ". Var CharStreamolmamanı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.

Kaynak

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ı).

Kaynak

TL; DR: Bakım maliyetine değmez.


* Merak ediyorsanız, kullandığım google sorgusu

site:http://mail.openjdk.java.net/ charstream

2
Birisi ne demek istediğini açıklığa kavuşturabilir 100K+ of JDK footprintmi?
yassin

3
@yassin Birisi kodu yazmak zorunda. Her akış uzmanlığının 100.000'den fazla kod satırı olduğunu tahmin ediyor
Michael

3
@BulgarSadykov " X'in neden Y olduğu gibi " ile ilgili bu tür sorular , orijinal yazarın zihnini okumak imkansız olduğu ve ortaya çıkmadıkça, alacağınız tek şey varsayım olduğu için genellikle fikir tabanlı olarak kapatılır. "Apache'nin HTTP istemcisine nasıl POST isteği gönderebilirim?" Diye sorarsam, kütüphaneye aşina olan herkes buna cevap verebilir. Bir kütüphanenin neden olduğu gibi tasarlanması genellikle cevap vermek imkansızdır. Buna gerçekten cevap verebilmemizin tek nedeni , konuşmalarının genel bir kaydı olmasıdır. İlk cümleyi ele almaya çalıştığım şey buydu.
Michael

2
@BulgarSadykov da bunu hatırlatıyor, Eric Lippert'in C # hakkında blogundan bahsediyor, ancak "Foo özelliği neden bu dilde uygulanmadı?" Konusunda stackoverflow.com/a/5588850/479251
Pac0

2
@BulgarSadykov Saygılarımla katılmıyorum. Yine, " Apache'nin HTTP istemcisine nasıl POST isteği gönderebilirim? " Gibi örnek sorumu tekrar ediyorum . Bu sorunun cevabı açıkça " çünkü tasarımcıların karar verdiği şey " ile başlamıyor . Ben ifadeyi değiştirmiyorum, üzgünüm.
Michael

7

Sadece chardesteklenmeyen diziler değil.

Orada ilkel akımların sadece 3 türleri - IntStream, LongStreamve DoubleStream.

Bunun bir sonucu olarak, Arraysdö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.


4
"Bu ilkel türlerin karşılık gelen ilkel akışları olmadığından." O zaman takip sorusu "neden" olurdu?
Federico klez Culloca

7
@FedericoklezCulloca takip sorusu burada
Eran

6

charStringUTF-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.

charKamusal 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 intboolean, 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 charve belki de java.text.Normalizerkod noktaları / Unicode dizelerinin benzersiz bir kanonik formu için kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.