현재 배열에서 스트림을 만들어야 할 때마다
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
배열에서 스트림을 생성하는 직접적인 방법이 있습니까?
답변
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()
경우 이 방법 내에서 .
답변
@ sol4me 솔루션의 대안 :
Stream.of(theArray)
이과의 차이 Arrays.stream()
: 그것은 않습니다 배열은 원시적 형태의 경우 차이를 확인하십시오. 예를 들어, 다음과 같은 경우 :
Arrays.stream(someArray)
어디 someArray
입니다 long[]
, 그것은을 반환합니다 LongStream
. Stream.of()
반면에, Stream<long[]>
단일 요소와 함께 를 반환합니다 .
답변
Stream.of("foo", "bar", "baz")
또는 이미 배열을 가지고 있다면 할 수도 있습니다
Stream.of(array)
기본 유형 사용을 위해 IntStream.of
또는 LongStream.of
등
답변
병렬 옵션이있는 저수준 방법으로도 만들 수 있습니다.
업데이트 : 전체 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)
답변
Arrays.stream을 사용할 수 있습니다.
Arrays.stream (배열);
배열 입력 유형에 따라 증기의 반환 형식은이 경우 보장하지만 String []
다음 반환 Stream<String>
, 경우 int []
다음 반환IntStream
입력 유형 배열을 이미 알고 있다면 입력 유형과 같은 특정 배열을 사용하는 것이 좋습니다 int[]
IntStream.of (배열);
Intstream을 반환합니다.
첫 번째 예에서 Java는 메소드 overloading
를 사용 하여 입력 유형을 기반으로 특정 메소드 를 찾습니다. 두 번째로 입력 유형과 호출 특정 메소드를 이미 알고 있습니다.
답변
거의 보이지 않지만 이것이 가장 직접적인 방법입니다
Stream.Builder<String> builder = Stream.builder();
for( int i = 0; i < array.length; i++ )
builder.add( array[i] );
Stream<String> stream = builder.build();