왜 char []이 Arrays.stream ()에서 지원되지 않는 유일한 배열입니까?


답변:


31

Eran이 말했듯이, 유일하게 빠진 것은 아닙니다.

A BooleanStream는 쓸모가 없으며 ByteStream(존재 하는 경우)는로 처리 InputStream하거나 IntStream(가능한대로 short) 변환 할 float수 있으며로 처리 할 수 ​​있습니다 DoubleStream.

char어쨌든 모든 문자를 표현할 수 없기 때문에 (링크 참조) 약간 의 레거시 스트림이됩니다. 어쨌든 대부분의 사람들이 코드 포인트를 다룰 필요는 없지만 이상하게 보일 수 있습니다. String.charAt()" 당신 은 실제로 모든 경우에 작동하지 않습니다"라고 생각하지 않고 사용하는 것을 의미합니다 .

그들이 중요하지 않은 것으로 간주되어 일부는 제외되었습니다. JB Nizet가 링크 된 질문 에서 말했듯이 :

다른 유형 (char, short, float)은 큰 성능 저하없이 더 큰 동등 (int, double)로 표시 될 수 있기 때문에 설계자는 기본 스트림을 3 가지 유형으로 제한하여 클래스 및 메소드의 폭발을 피하기로 선택했습니다.

그 이유 BooleanStream는 쓸모가 없을 것입니다. 2 개의 값만 있고 조작이 많이 제한되기 때문입니다. 수학적 연산이 없으며 어쨌든 많은 부울 값으로 작업하고 있습니까?


7
" BooleanStream무용지물": 왜?
glglgl

12
누군가가 예를 들어 reduce(Boolean::logicalAnd)또는 reduce(Boolean::logicalOr)에 대해 할 필요가 있다고 가정하는 것이 정말로 부당한가요 boolean[]? 결국, 메소드 logicalAndlogicalOrJava 8에 추가되었으므로 이러한 축소 작업을 수행 할 수 있습니다 Stream<Boolean>. 그런데 원하는 의미에 따라 또는 char[]을 사용하여 쉽게 스트리밍 할 수 있습니다 . CharBuffer.wrap(array).chars()CharBuffer.wrap(array).codePoints()
Holger

2
@Holger는 Boolean::logicalAnd존재 하기 때문에 반드시의 존재를 보증하지는 않습니다 BooleanStream. 이것들은 결국 비 스트림 람다 상황에서 사용될 수 있습니다. 나는 누군가가 것이라고 상상할 수 싶어reduce(Boolean::logicalAnd), 그러나 어떠한 경우에도 사람의 수행 필요성 을 할 수 있습니다.
카야 만

4
무슨 주장을하는지 모르겠습니다. 극단적 인 형태 : "누군가하고 싶을 것 while (i < limit)같지만, 아무도 분기 및 점프 조립 지침을 사용하여 그것을 할 필요 가 없다"
Alexander-Reinstate Monica

11
<Primitive>Stream모든 기본 유형에 대해 없는 유일한 이유 는 API를 너무 많이 팽창시키기 때문입니다. 물어야 할 올바른 질문은 "왜 IntStream, 왜 있는가?"입니다. 불행히도 대답은 Java의 유형 시스템이 Stream<int>모든 성능 비용을 사용하지 않고 표현할 수있을 정도로 충분히 발달되지 않았기 때문 Integer입니다. 자바 스택에 할당 또는 인라인 다른 데이터 구조 내에서 직접 포함 할 수 값 유형을 가지고 있다면, 이외의 아무것도 그러한 필요가 없을 것Stream<T>
분석 재개 모니카 - 알렉산더

32

물론 " 디자이너가 결정한 것이기 때문 "입니다. CharStream존재할 수 없는 기술적 이유는 없습니다 .

정당성을 원한다면, OpenJDK 메일 링리스트 *를 돌려야합니다. JDK의 문서는 왜 그 이유가 무엇인지 정당화하는 습관이 아닙니다 .

누군가가 물었다

문자 / 바이트 스트림을 나타 내기 위해 IntStream을 사용하는 것은 약간 불편합니다. CharStream과 ByteStream도 추가해야합니까?

Brian Goetz (Java Language Architect)의 답변에 따르면

짧은 대답 : 아닙니다.

거의 사용되지 않는 이러한 형식에 대해 각각 100K + 이상의 JDK 풋 프린트를 사용할 가치가 없습니다. 그리고 우리가 그것들을 추가한다면, 누군가는 짧거나 부유하거나 부울을 요구할 것입니다.

다시 말해 사람들이 우리에게 모든 기본 전문화가 있다고 주장하면 기본 전문화가 없을 것입니다. 현 상태보다 더 나쁠 것입니다.

출처

그는 또한 다른 곳에서 같은 것을 말한다

문자를 문자로 처리하려면 쉽게 문자로 다운 캐스트 할 수 있습니다. 전체 '다른 스트림 세트를 가질만큼 중요한 유스 케이스처럼 보이지 않습니다. (짧은 바이트, 플로트와 동일).

출처

TL; DR : 유지 보수 비용이 들지 않습니다.


* 궁금한 점이 있다면 내가 사용한 Google 검색어는

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

2
누군가가 무엇을 의미하는지 명확히 할 수 100K+ of JDK footprint있습니까?
yassin

3
@yassin 누군가가 코드를 작성해야합니다. 그는 스트림의 각 전문화가 10 만 라인 이상의 코드
Michael

3
@BulgarSadykov " X가 Y와 같은 이유 "에 대한 이러한 질문은 원저자 의 마음을 읽을 수 없기 때문에 종종 의견에 근거하여 닫히고 그들이 나타나지 않으면, 당신이 얻을 수있는 것은 추측 일뿐입니다. "Apache의 HTTP 클라이언트로 POST 요청을 보내려면 어떻게해야합니까?" 도서관이 설계된 방식으로 설계된 이유 는 대개 대답하기가 불가능합니다. 우리가 이것에 실제로 대답 할 수있는 유일한 이유는 그들의 대화에 대한 공개 기록이 있기 때문입니다. 그것이 첫 번째 문장으로 얻으려고했던 것입니다.
마이클

2
그것은 또한이 연상 @BulgarSadykov는 C #을 약 에릭 Lippert의 블로그를 언급하지만, "왜 푸 기능을 언어로 구현되지 않습니다"의 주제에 stackoverflow.com/a/5588850/479251
Pac0

2
@BulgarSadykov 매우 동의하지 않습니다. 다시 한 번, " Apache의 HTTP 클라이언트로 POST 요청을 보내려면 어떻게합니까? "라는 질문을 반복 합니다. 그 질문에 대한 답 " 디자이너가 결정한 것이기 때문에 "로 시작하지 않습니다 . 나는 문구를 바꾸지 않고 있습니다. 죄송합니다.
마이클

7

char지원되지 않는 배열 만이 아닙니다.

이 기본 스트림의 3 종류가 있습니다 - IntStream, LongStream하고 DoubleStream.

따라서, Arrays변환 방법을 가지고 int[], long[]그리고 double[]대응하는 기본 스트림에있다.

에 대한 대응 방법이 없습니다 boolean[], byte[], short[], char[]float[], 이러한 기본 형식은 더 원시적 스트림을 해당 이후는.


4
"이 프리미티브 유형에는 해당 프리미티브 스트림이 없습니다." 그러면 후속 질문은 "왜"일까요?
Federico klez Culloca

7
@FedericoklezCulloca 후속 질문은 여기
Eran

6

charStringUTF-16 값 저장 의 종속 부분입니다 . 코드 포인트 인 유니 코드 심볼 은 때때로 대리 문자 쌍입니다. 따라서 문자가있는 간단한 솔루션은 유니 코드 도메인의 일부만 다룹니다.

char공공 유형이 될 권리 가있는 시간이 있었습니다. 그러나 요즘은 사용하는 것이 좋습니다 코드 포인트를IntStream. char 스트림은 대리 쌍을 직접 처리 할 수 ​​없습니다.

또 다른보다 유력한 이유는 JVM "프로세서"모델이 int부울, 바이트, 쇼트 및 문자를 int 크기의 스토리지 위치에 유지하면서 가장 작은 "레지스터"를 사용하기 때문입니다. 자바 클래스를 부 풀릴 필요는 없었기 때문에 가능한 모든 카피 변형을 자제했습니다.

에서 먼 미래의 하나를 제공, 제네릭 형식 매개 변수로 함수에 허용되는 기본 유형을 예상 List<int>. 그런 다음을 볼 수 있습니다 Stream<char>.

현재로서는을 피하고 char, java.text.Normalizer고유 한 표준 형식의 코드 포인트 / 유니 코드 문자열에 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.