배열에서 스트림을 어떻게 만들 수 있습니까?


133

현재 배열에서 스트림을 만들어야 할 때마다

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();

배열에서 스트림을 생성하는 직접적인 방법이 있습니까?

답변:


201

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)하면 반환됩니다 . 따라서 기본 유형의 요컨대 두 가지 방법의 차이점을 볼 수 있습니다.IntStreamint[]

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()경우 이 방법 내에서 .


9
Arrays.stream기본 배열에 대한 모든 오버로드 된 사례가 있기 때문에이 답변이 더 좋습니다 . 즉 Stream.of(new int[]{1,2,3}), 당신에게 a 를 줄 Stream<int[]>것이지만 아마도 당신이 원하는 것입니다. 그래서 +1Arrays.streamIntStream
user2336315

3
@Dima 맛의 문제인 것 같습니다. 더 나은 의미에서 의미 Stream.of당신에게 놀라움 줄 수있는 (전화 할 때와 같은 Arrays.asList원시적 배열을하고 사람들은 기대 List<Integer>등을) :-)
user2336315

3
Arrays.stream배열의 범위 스트리밍을 지원 IntStream.of하지만 그렇지 않습니다. 반면에, Stream.of당신이 경우에 더 나은 선택을 Stream<int[]> 크기를 1...
홀거

4
@Dima 하위 범위 오버로드는 Arrays.stream사용하는 것이 바람직 Stream.of(array).skip(n).limit(m)하지만 전자는 SIZED 스트림을 생성하지만 후자는 그렇지 않습니다. 그 이유는 limit(m)크기가 m보다 작은 지 아닌지 알지 못하는 m반면 Arrays.stream범위는 스트림의 정확한 크기를 확인하고 알고 있기 때문입니다.
스튜어트 마크

6
이 작은 드라마는 결론을 내렸다보고에 관심이있는 독자들을 위해, Arrays.stream(array,start,end)반환 Stream구현이가 여기 반면, Stream.of(array).skip().limit()반환 Stream구현이이 안에 이 방법 .
Stuart Marks

43

@ sol4me 솔루션의 대안 :

Stream.of(theArray)

이과의 차이 Arrays.stream(): 그것은 않습니다 배열은 원시적 형태의 경우 차이를 확인하십시오. 예를 들어, 다음과 같은 경우 :

Arrays.stream(someArray)

어디 someArray입니다 long[], 그것은을 반환합니다 LongStream. Stream.of()반면에, Stream<long[]>단일 요소와 함께 를 반환합니다 .


1
@Dima는 확실하지만, 그것도 Arrays.stream()잘 작동합니다
fge

2
음, 스트림은 편리! 기본 배열을 다룰 *Stream.of()때 호출 할 필요가 없습니다 Arrays.stream(). 그리고 실제 객체가 아닌 배열에 관해서는, 이것은 Java입니다. 1.0 이후로 그랬습니다. 이것을 극복하는 것은 아무것도 도움이되지 않습니다
fge

2
@Dima도 마찬가지입니다. 당신은 고려 Arrays.stream(), 편리하지 편리하다고 생각. 충분했다.
fge

2
@Dima 네, 당신의 주장 *Stream.of()이 더 틀리기 쉽다고 생각합니다 . 그것은 환경 설정 의 문제이기 때문에 . 나는 Arrays.stream()그런 경우를 선호 하므로 Stream.of()더 편리한 일반적인 규칙 (Peano 대수) 으로 잘못됩니다 .
fge

3
@ 디마 : 그것은 선호의 문제입니다. 그 차이는 엄청나게 작아서 전혀 중요하지 않습니다. 더 구체적으로 말하면, 몇 문자의 차이는 아무것도 아닙니다 . 표준 라이브러리 내의 패키지로 추가로 가져 오는 것은 아무것도 아닙니다 . 그리고 실제로 varargs 오버로드 대신 수동으로 배열을 만드는 것은 아무것도 아닙니다 .
Jeroen Vannevel

14
Stream.of("foo", "bar", "baz")

또는 이미 배열을 가지고 있다면 할 수도 있습니다

Stream.of(array) 

기본 유형 사용을 위해 IntStream.of또는 LongStream.of


내가 이해하지 못하는 것은 int[]varargs를 허용하는 메소드에 전달할 수있는 Stream.of(intArray)경우 Stream<Integer>대신 대신 생성 하지 않는 이유는 Stream<int[]>무엇입니까? 또한 프리미티브에 대한 특수 스트림 클래스가있는 기술적 이유가 있습니까?
ass

1
자바 프리미티브는 이상한 짐승입니다. int[]다른 배열과 다릅니다. 그것은의 서브 클래스 아니다 Object[], 그러나 그것은 이다 의 서브 클래스 Object. 따라서에 전달 Stream.of하면 Object, 매개 변수로 사용되며의 스트림을 얻습니다 int[]. 이것이 프리미티브에 대한 특수 클래스를 갖는 이유 중 하나입니다. 프리미티브 배열에서 스트림을 만들지 않으면 상당히 고통 스럽습니다. 또 다른 이유는이 부담 할 필요가 없기 때문에 전문 클래스가 더 효율적이라는 것이다 Object권투에서 오버 헤드 (변환 intInteger정상 객체처럼 보이게하는).
Dima

아, int[]는 이므로 Object오버로드 된 메소드 of(T t)와 일치 하므로을 반환합니다 Stream<int[]>. 이론적으로 말하자면,이 방법을 사용할 수 없다면 우리는 그 Stream<Integer>대가를 받았을 까요? 또는 일치하는 방법을 찾지 못해 컴파일 오류가 발생합니까? 즉, 다음 int[]과 같이 취급 될 수 없습니다T...
as a

1
아니요, 우리 는 여전히 똑같은 방식으로 일치 Stream<Integer>하기 때문에 Stream.of(t ... T) 그렇게 하지 않습니다 .
Dima

0

병렬 옵션이있는 저수준 방법으로도 만들 수 있습니다.

업데이트 : 전체 array.length (길이-1 아님)를 사용하십시오.

/** 
 * 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)

0

Arrays.stream을 사용할 수 있습니다.

Arrays.stream (배열); 

배열 입력 유형에 따라 증기의 반환 형식은이 경우 보장하지만 String []다음 반환 Stream<String>, 경우 int []다음 반환IntStream

입력 유형 배열을 이미 알고 있다면 입력 유형과 같은 특정 배열을 사용하는 것이 좋습니다 int[]

 IntStream.of (배열); 

Intstream을 반환합니다.

첫 번째 예에서 Java는 메소드 overloading를 사용 하여 입력 유형을 기반으로 특정 메소드 를 찾습니다. 두 번째로 입력 유형과 호출 특정 메소드를 이미 알고 있습니다.


0

거의 보이지 않지만 이것이 가장 직접적인 방법입니다

Stream.Builder<String> builder = Stream.builder();
for( int i = 0; i < array.length; i++ )
  builder.add( array[i] );
Stream<String> stream = builder.build();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.