답변:
Arrays.stream 예를 사용할 수 있습니다
Arrays.stream(array);
Stream.of
@fge에서 언급 한 것처럼 사용할 수도 있습니다.
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
그러나 참고 Stream.of(intArray)
는 반환 Stream<int[]>
하는 반면 유형 배열을 전달 Arrays.stream(intArr)
하면 반환됩니다 . 따라서 기본 유형의 요컨대 두 가지 방법의 차이점을 볼 수 있습니다.IntStream
int[]
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
프리미티브 배열을에 전달 Arrays.stream
하면 다음 코드가 호출됩니다.
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
기본 배열을 Stream.of
다음 코드 로 전달하면 호출됩니다.
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
따라서 다른 결과를 얻습니다.
업데이트 : Stuart Marks 의견에서 언급했듯이 하위 범위 오버로드는 Arrays.stream
사용하는 것이 바람직 Stream.of(array).skip(n).limit(m)
하지만 전자는 SIZED 스트림을 생성하지만 후자는 그렇지 않습니다. 그 이유는 limit(m)
크기가 m보다 작은 지 또는 m보다 작은 지, Arrays.stream
범위를 확인하고 스트림의 정확한 크기를 알고 있기 때문입니다. Arrays.stream(array,start,end)
여기서 반환 된 스트림 구현의 Stream.of(array).skip().limit()
경우 이 방법 내에서 .
Stream.of
당신에게 놀라움 줄 수있는 (전화 할 때와 같은 Arrays.asList
원시적 배열을하고 사람들은 기대 List<Integer>
등을) :-)
Arrays.stream
배열의 범위 스트리밍을 지원 IntStream.of
하지만 그렇지 않습니다. 반면에, Stream.of
당신이 경우에 더 나은 선택을 할Stream<int[]>
크기를 1
...
Arrays.stream
사용하는 것이 바람직 Stream.of(array).skip(n).limit(m)
하지만 전자는 SIZED 스트림을 생성하지만 후자는 그렇지 않습니다. 그 이유는 limit(m)
크기가 m
보다 작은 지 아닌지 알지 못하는 m
반면 Arrays.stream
범위는 스트림의 정확한 크기를 확인하고 알고 있기 때문입니다.
Arrays.stream(array,start,end)
반환 Stream
구현이가 여기 반면, Stream.of(array).skip().limit()
반환 Stream
구현이이 안에 이 방법 .
@ sol4me 솔루션의 대안 :
Stream.of(theArray)
이과의 차이 Arrays.stream()
: 그것은 않습니다 배열은 원시적 형태의 경우 차이를 확인하십시오. 예를 들어, 다음과 같은 경우 :
Arrays.stream(someArray)
어디 someArray
입니다 long[]
, 그것은을 반환합니다 LongStream
. Stream.of()
반면에, Stream<long[]>
단일 요소와 함께 를 반환합니다 .
Arrays.stream()
잘 작동합니다
*Stream.of()
때 호출 할 필요가 없습니다 Arrays.stream()
. 그리고 실제 객체가 아닌 배열에 관해서는, 이것은 Java입니다. 1.0 이후로 그랬습니다. 이것을 극복하는 것은 아무것도 도움이되지 않습니다
Arrays.stream()
, 편리하지 난 편리하다고 생각. 충분했다.
*Stream.of()
이 더 틀리기 쉽다고 생각합니다 . 그것은 환경 설정 의 문제이기 때문에 . 나는 Arrays.stream()
그런 경우를 선호 하므로 Stream.of()
더 편리한 일반적인 규칙 (Peano 대수) 으로 잘못됩니다 .
Stream.of("foo", "bar", "baz")
또는 이미 배열을 가지고 있다면 할 수도 있습니다
Stream.of(array)
기본 유형 사용을 위해 IntStream.of
또는 LongStream.of
등
int[]
varargs를 허용하는 메소드에 전달할 수있는 Stream.of(intArray)
경우 Stream<Integer>
대신 대신 생성 하지 않는 이유는 Stream<int[]>
무엇입니까? 또한 프리미티브에 대한 특수 스트림 클래스가있는 기술적 이유가 있습니까?
int[]
다른 배열과 다릅니다. 그것은의 서브 클래스 아니다 Object[]
, 그러나 그것은 이다 의 서브 클래스 Object
. 따라서에 전달 Stream.of
하면 Object
, 매개 변수로 사용되며의 스트림을 얻습니다 int[]
. 이것이 프리미티브에 대한 특수 클래스를 갖는 이유 중 하나입니다. 프리미티브 배열에서 스트림을 만들지 않으면 상당히 고통 스럽습니다. 또 다른 이유는이 부담 할 필요가 없기 때문에 전문 클래스가 더 효율적이라는 것이다 Object
권투에서 오버 헤드 (변환 int
에 Integer
정상 객체처럼 보이게하는).
int[]
는 이므로 Object
오버로드 된 메소드 of(T t)
와 일치 하므로을 반환합니다 Stream<int[]>
. 이론적으로 말하자면,이 방법을 사용할 수 없다면 우리는 그 Stream<Integer>
대가를 받았을 까요? 또는 일치하는 방법을 찾지 못해 컴파일 오류가 발생합니까? 즉, 다음 int[]
과 같이 취급 될 수 없습니다T...
Stream<Integer>
하기 때문에 Stream.of(t ... T)
그렇게 하지 않습니다 .
병렬 옵션이있는 저수준 방법으로도 만들 수 있습니다.
/**
* Creates a new sequential or parallel {@code Stream} from a
* {@code Spliterator}.
*
* <p>The spliterator is only traversed, split, or queried for estimated
* size after the terminal operation of the stream pipeline commences.
*
* @param <T> the type of stream elements
* @param spliterator a {@code Spliterator} describing the stream elements
* @param parallel if {@code true} then the returned stream is a parallel
* stream; if {@code false} the returned stream is a sequential
* stream.
* @return a new sequential or parallel {@code Stream}
*
* <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
*/
StreamSupport.stream(Arrays.spliterator(array, 0, array.length), true)
Arrays.stream을 사용할 수 있습니다.
Arrays.stream (배열);
배열 입력 유형에 따라 증기의 반환 형식은이 경우 보장하지만 String []
다음 반환 Stream<String>
, 경우 int []
다음 반환IntStream
입력 유형 배열을 이미 알고 있다면 입력 유형과 같은 특정 배열을 사용하는 것이 좋습니다 int[]
IntStream.of (배열);
Intstream을 반환합니다.
첫 번째 예에서 Java는 메소드 overloading
를 사용 하여 입력 유형을 기반으로 특정 메소드 를 찾습니다. 두 번째로 입력 유형과 호출 특정 메소드를 이미 알고 있습니다.
Arrays.stream
기본 배열에 대한 모든 오버로드 된 사례가 있기 때문에이 답변이 더 좋습니다 . 즉Stream.of(new int[]{1,2,3})
, 당신에게 a 를 줄Stream<int[]>
것이지만 아마도 당신이 원하는 것입니다. 그래서 +1Arrays.stream
IntStream