Java/스트림(Stream)

[Java]스트림을 배열로 변환하는 방법(Stream to Array)

DevStory 2022. 9. 5.

스트림을 배열로 변환하는 방법

이번 포스팅은 Stream 클래스에서 제공하는 toArray() 메서드를 사용하여 스트림을 배열로 변환하는 방법을 소개합니다.


방법 1. Stream 클래스의 toArray 메서드

Stream 클래스에서 제공하는 toArray() 메서드는 오버로드된 두 가지 버전이 존재합니다.

Object[] toArray();
<A> A[] toArray(IntFunction<A[]> generator);

첫 번째, toArray() 메서드는 매개변수가 존재하지 않으며, Object 타입의 배열을 반환합니다.

두 번째, toArray() 메서드는 새로운 배열을 생성하는 생성자(generator) 함수를 매개변수로 가지며, A 타입(제네릭 타입)의 배열을 반환합니다.

 

그리고 기본 타입을 다루는 IntStream, LongStream, DoubleStream 클래스에도 toArray() 메서드가 존재합니다.

// IntStream 클래스에 존재하는 toArray() 메서드
int[] toArray();

// LongStream 클래스에 존재하는 toArray() 메서드
long[] toArray();

// DoubleStream 클래스에 존재하는 toArray() 메서드
double[] toArray();

세 가지 클래스의 toArray() 메서드는 매개변수가 존재하지 않으며, IntStream 클래스의 toArray() 메서드는 int 타입의 배열, LongStream 클래스의 toArray() 메서드는 long 타입의 배열, DoubleStream 클래스의 toArray() 메서드는 double 타입의 배열을 반환합니다.


예제 1. 기본 타입

다음 예제는 기본 타입을 다루는 IntStream, LongStream, DoubleStream을 배열로 변환합니다.

public static void main(String args[]) {
  IntStream intStream = IntStream.of(10, 20, 30);
  int[] intArray = intStream.toArray();

  System.out.println("intArray: " +
          Arrays.toString(intArray));

  LongStream longStream = LongStream.of(100, 200, 300);
  long[] longArray = longStream.toArray();

  System.out.println("longArray: " +
          Arrays.toString(longArray));

  DoubleStream doubleStream = DoubleStream.of(11.111, 22.222, 33.333);
  double[] doubleArray = doubleStream.toArray();

  System.out.println("doubleArray: " +
          Arrays.toString(doubleArray));
}

[실행 결과]

intArray: [10, 20, 30]
longArray: [100, 200, 300]
doubleArray: [11.111, 22.222, 33.333]

 

만약, 기본 타입의 값이 IntStream, LongStream, DoubleStream 클래스가 아닌 Stream 클래스의 인스턴스에 할당된 경우 다음 예제처럼 toArray() 메서드의 매개변수에 래퍼 클래스(Wrapper Class) 타입인 배열 생성자 함수를 전달합니다.

public static void main(String args[]) {
  Stream<Integer> intStream = Stream.of(10, 20, 30);
  Integer[] intArray = intStream.toArray(Integer[]::new);

  System.out.println("intArray: " +
          Arrays.toString(intArray));

  Stream<Double> doubleStream = Stream.of(11.111, 22.222, 33.333);
  Double[] doubleArray = doubleStream.toArray(Double[]::new);

  System.out.println("doubleArray: " +
          Arrays.toString(doubleArray));
}

[실행 결과]

intArray: [10, 20, 30]
doubleArray: [11.111, 22.222, 33.333]

예제 2. 참조 타입

기본 타입이 아닌 참조 타입인 경우 클래스의 객체에서 toArray() 메서드를 호출하며, 메서드 참조 또는 람다 표현식을 사용하여 생성자 함수를 전달합니다.

 

다음 예제는 Person 타입의 Stream을 배열로 변환합니다.

public static void main(String args[]) {
  List<Person> personList = new ArrayList<>();
  personList.add(new Person("둘리", 10));
  personList.add(new Person("또치", 50));

  Stream<Person> personStream1 = personList.stream();
  Stream<Person> personStream2 = personList.stream();

  // 1. 메서드 참조를 사용하여 생성자 함수 전달
  Person[] personArray1 = personStream1.toArray(Person[]::new);

  // 2. 람다 표현식을 사용하여 생성자 함수 전달
  Person[] personArray2 = personStream2.toArray(size -> new Person[size]);
}
반응형

댓글