programing

어레이에서 스트림을 작성하려면 어떻게 해야 합니까?

procenter 2022. 10. 20. 21:45
반응형

어레이에서 스트림을 작성하려면 어떻게 해야 합니까?

현재 어레이에서 스트림을 생성해야 할 때마다

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[]>1개의 요소로 구성됩니다.

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

또는 이미 어레이가 있는 경우 다음을 수행할 수도 있습니다.

Stream.of(array) 

프리미티브 타입의 경우IntStream.of또는LongStream.of기타.

거의 볼 수 없지만, 이것이 가장 직접적인 방법이다

Stream.Builder<String> builder = Stream.builder();
for( int i = 0; i < array.length; i++ )
  builder.add( array[i] );
Stream<String> stream = builder.build();

병렬 옵션이 있는 로우 레벨 방식으로도 만들 수 있습니다.

업데이트: full 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을 사용할 수 있습니다.

어레이.스트림(어레이);

이렇게 하면 어레이 입력 유형에 따라 스팀이 반환됩니다.String []그 후 돌아오다Stream<String>,한다면int []그 후 반환한다.IntStream

입력 유형 어레이를 이미 알고 있다면 입력 유형으로 특정 어레이를 사용하는 것이 좋습니다.int[]

IntStream.of(어레이);

그러면 Intstream이 반환됩니다.

첫 번째 예에서는 Java는 메서드를 사용합니다.overloading입력 타입에 근거해 특정의 메서드를 검색해, 2번째와 같이, 입력 타입과 특정의 메서드를 이미 알고 있습니다.

언급URL : https://stackoverflow.com/questions/27888429/how-can-i-create-a-stream-from-an-array

반응형