답변:
Eran이 말했듯이, 유일하게 빠진 것은 아닙니다.
A BooleanStream
는 쓸모가 없으며 ByteStream
(존재 하는 경우)는로 처리 InputStream
하거나 IntStream
(가능한대로 short
) 변환 할 float
수 있으며로 처리 할 수 있습니다 DoubleStream
.
char
어쨌든 모든 문자를 표현할 수 없기 때문에 (링크 참조) 약간 의 레거시 스트림이됩니다. 어쨌든 대부분의 사람들이 코드 포인트를 다룰 필요는 없지만 이상하게 보일 수 있습니다. String.charAt()
" 당신 은 실제로 모든 경우에 작동하지 않습니다"라고 생각하지 않고 사용하는 것을 의미합니다 .
그들이 중요하지 않은 것으로 간주되어 일부는 제외되었습니다. JB Nizet가 링크 된 질문 에서 말했듯이 :
다른 유형 (char, short, float)은 큰 성능 저하없이 더 큰 동등 (int, double)로 표시 될 수 있기 때문에 설계자는 기본 스트림을 3 가지 유형으로 제한하여 클래스 및 메소드의 폭발을 피하기로 선택했습니다.
그 이유 BooleanStream
는 쓸모가 없을 것입니다. 2 개의 값만 있고 조작이 많이 제한되기 때문입니다. 수학적 연산이 없으며 어쨌든 많은 부울 값으로 작업하고 있습니까?
BooleanStream
무용지물": 왜?
reduce(Boolean::logicalAnd)
또는 reduce(Boolean::logicalOr)
에 대해 할 필요가 있다고 가정하는 것이 정말로 부당한가요 boolean[]
? 결국, 메소드 logicalAnd
와 logicalOr
Java 8에 추가되었으므로 이러한 축소 작업을 수행 할 수 있습니다 Stream<Boolean>
. 그런데 원하는 의미에 따라 또는 char[]
을 사용하여 쉽게 스트리밍 할 수 있습니다 . CharBuffer.wrap(array).chars()
CharBuffer.wrap(array).codePoints()
Boolean::logicalAnd
존재 하기 때문에 반드시의 존재를 보증하지는 않습니다 BooleanStream
. 이것들은 결국 비 스트림 람다 상황에서 사용될 수 있습니다. 나는 누군가가 것이라고 상상할 수 싶어 할 reduce(Boolean::logicalAnd)
, 그러나 어떠한 경우에도 사람의 수행 필요성 을 할 수 있습니다.
while (i < limit)
같지만, 아무도 분기 및 점프 조립 지침을 사용하여 그것을 할 필요 가 없다"
<Primitive>Stream
모든 기본 유형에 대해 없는 유일한 이유 는 API를 너무 많이 팽창시키기 때문입니다. 물어야 할 올바른 질문은 "왜 IntStream
, 왜 있는가?"입니다. 불행히도 대답은 Java의 유형 시스템이 Stream<int>
모든 성능 비용을 사용하지 않고 표현할 수있을 정도로 충분히 발달되지 않았기 때문 Integer
입니다. 자바 스택에 할당 또는 인라인 다른 데이터 구조 내에서 직접 포함 할 수 값 유형을 가지고 있다면, 이외의 아무것도 그러한 필요가 없을 것Stream<T>
물론 " 디자이너가 결정한 것이기 때문 "입니다. CharStream
존재할 수 없는 기술적 이유는 없습니다 .
정당성을 원한다면, OpenJDK 메일 링리스트 *를 돌려야합니다. JDK의 문서는 왜 그 이유가 무엇인지 정당화하는 습관이 아닙니다 .
누군가가 물었다
문자 / 바이트 스트림을 나타 내기 위해 IntStream을 사용하는 것은 약간 불편합니다. CharStream과 ByteStream도 추가해야합니까?
Brian Goetz (Java Language Architect)의 답변에 따르면
짧은 대답 : 아닙니다.
거의 사용되지 않는 이러한 형식에 대해 각각 100K + 이상의 JDK 풋 프린트를 사용할 가치가 없습니다. 그리고 우리가 그것들을 추가한다면, 누군가는 짧거나 부유하거나 부울을 요구할 것입니다.
다시 말해 사람들이 우리에게 모든 기본 전문화가 있다고 주장하면 기본 전문화가 없을 것입니다. 현 상태보다 더 나쁠 것입니다.
그는 또한 다른 곳에서 같은 것을 말한다
문자를 문자로 처리하려면 쉽게 문자로 다운 캐스트 할 수 있습니다. 전체 '다른 스트림 세트를 가질만큼 중요한 유스 케이스처럼 보이지 않습니다. (짧은 바이트, 플로트와 동일).
TL; DR : 유지 보수 비용이 들지 않습니다.
* 궁금한 점이 있다면 내가 사용한 Google 검색어는
site:http://mail.openjdk.java.net/ charstream
100K+ of JDK footprint
있습니까?
char
지원되지 않는 배열 만이 아닙니다.
이 기본 스트림의 3 종류가 있습니다 - IntStream
, LongStream
하고 DoubleStream
.
따라서, Arrays
변환 방법을 가지고 int[]
, long[]
그리고 double[]
대응하는 기본 스트림에있다.
에 대한 대응 방법이 없습니다 boolean[]
, byte[]
, short[]
, char[]
와 float[]
, 이러한 기본 형식은 더 원시적 스트림을 해당 이후는.
char
String
UTF-16 값 저장 의 종속 부분입니다 . 코드 포인트 인 유니 코드 심볼 은 때때로 대리 문자 쌍입니다. 따라서 문자가있는 간단한 솔루션은 유니 코드 도메인의 일부만 다룹니다.
char
공공 유형이 될 권리 가있는 시간이 있었습니다. 그러나 요즘은 사용하는 것이 좋습니다 코드 포인트를 은 IntStream
. char 스트림은 대리 쌍을 직접 처리 할 수 없습니다.
또 다른보다 유력한 이유는 JVM "프로세서"모델이 int
부울, 바이트, 쇼트 및 문자를 int 크기의 스토리지 위치에 유지하면서 가장 작은 "레지스터"를 사용하기 때문입니다. 자바 클래스를 부 풀릴 필요는 없었기 때문에 가능한 모든 카피 변형을 자제했습니다.
에서 먼 미래의 하나를 제공, 제네릭 형식 매개 변수로 함수에 허용되는 기본 유형을 예상 List<int>
. 그런 다음을 볼 수 있습니다 Stream<char>
.
현재로서는을 피하고 char
, java.text.Normalizer
고유 한 표준 형식의 코드 포인트 / 유니 코드 문자열에 사용하십시오.