영호

[JAVA] Array를 stream으로 (Arrays.stream() vs Stream.of()) 본문

Language/JAVA

[JAVA] Array를 stream으로 (Arrays.stream() vs Stream.of())

0h0 2022. 10. 28. 20:28
반응형

개요

stream을 공부하면서 Array를 stream으로 만드는 방법이 2가지가 있는 것을 알았고, 2가지 방법의 차이점에 대해 궁금증이 생겨 알아본 내용입니다.

Collection이 아닌 Array를 stream으로 만들 때 2가지 방법이 있습니다.

  1. Arrays.stream()
  2. Stream.of()

위 2가지 방법은 parameter로 primitive타입의 배열을 넘기느냐, non-promitive타입의 배열을 넘기느냐에 따라 반환 값이 달라집니다.

Stream.of()

primitive타입 배열로 Stream.of() 호출했을 때 실행되는 코드

public static<T> Stream<T> of(T t) {
    return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}

// int배열의 반환타입 : Stream<int[]>

non-primitive타입 배열로 Stream.of() 호출했을 때 실행되는 코드

@SafeVarargs
@SuppressWarnings("varargs") // Creating a stream from an array is safe
public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

// Integer배열의 반환타입 : Stream<Integer>
  • Stream.of()의 경우 primitive, non-primitive에 상관없이 모두 Stream객체가 반환됩니다.

Arrays.stream()

primitive타입 배열로 Arrays.stream() 호출했을 때 실행되는 코드

public static IntStream stream(int[] array) {
    return stream(array, 0, array.length);
}

// int배열의 반환타입 : IntStream

non-primitive타입 배열로 Arrays.stream() 호출했을 때 실행되는 코드

public static <T> Stream<T> stream(T[] array) {
    return stream(array, 0, array.length);
}

// Integer의 반환타입 : Stream<Integer>
  • Arrays.stream()의 경우 primitive타입을 넘기면 해당 타입에 맞는 기본형 stream이 반환됩니다.
  • non-primitive의 경우 Stream객체가 반환됩니다.

결론

  • stream.of()의 경우 primitive, non-primitive 상관없이 Stream객체를 반환하지만,
  • Arrays.stream()의 경우 primitive는 그에 맞는 기본형 stream, non-primitive는 Stream객체가 반환됩니다.
  • 세부적인 이유까지 찾아보려 했지만, 본 포스팅 정도로만 찾아볼 수 있었습니다. 
  • Github Link에 자세한 구현 코드가 있으니 더 알아보고 싶으신 분들은 참고하시면 좋을 거 같습니다:)
반응형
Comments