자바/스트림

collect() 메서드(1)

백_곰 2022. 4. 19. 16:54

1. collect() 메서드란?

- 스트림의 요소를 수집하는 최종 연산으로 앞서 배운 리듀싱과 유사하다.

 

- 어떻게 수집할 것인지에 대한 방법이 정의되어 있는 Collector가 있다.

 

- Collector 인터페이스로 직접 구현도 가능하고 미리 작성된 Collectors 클래스를 사용할 수 있다.

 

- collect() 메서드의 매개변수는 Collector를 필요로 한다. 즉, Collector를 구현한 클래스의 객체

이어야 한다는 뜻이다.

( 마치 sort() 메서드 위해서 Comparator가 필요한 것처럼 )

 

 

Object collect(Collector collector)

Object collect(Supplier supplier, BiConsumer accumlator, BiConsumer combiner)

 

( 매개변수가 3개나 정의된 메서드는 잘 쓰이지 않지만, Collector 인터페이스를 구현하지 않고

람다식으로 처리하는 경우 매우 편리하다. )

 

 

 

 

2. 스트림을 컬렉션과 배열로 변환 - toList(), toSet(), toMap(), toCollection(), toArray()

- 스트림의 모든 요소를 컬렉션에 수집하려면, Collectors 클래스toList()와 같은 메서드를

사용하면 된다. 아래의 예시를 보자.

 

 

 

- ListSet이 아닌 특정 컬렉션이라면, toCollection()에 해당 컬렉션의 생성자 참조를 매개변수로 넣어주면

된다. 아래의 예시를 보자.

 

 

 

- Map키와 값의 쌍으로 저장해야하므로 객체의 어떤 필드를 키로 사용할지와 값으로 사용하지

지정해주어야 한다.아래의 예시를 보자.

 

// Person을 초기화하는 p->p에서 Function.indentity()를 쓸 수도 있다.

 

 

 

- 스트림에 저장된 요소들을 'T[]' 타입의 배열로 변환하려면, toArray()를 사용하면 된다.

단, 해당 타입의 생정자 참조를 매개변수로 지정해주어야 한다. 만약 그렇지 않을 경우,

'Object[]'가 반환된다.

 

ex)

Student[] stuNames = studentStream.toArray(Student::new);   //컴파일 성공

Student[] stuNames = studentStream.toArray();   //에러 방생

Object[] stuNames = studentStream.toArray();   //컴파일 성공

 

 

 

 

 

3. 통계 - counting(), summingInt(), averagingInt(), maxBy(), minBy()

-  다음 collect() 메서드(2)에서 배울 groupingBy()와 함께 사용할 때 이 메서드들이 필요로

하기 때문에, 간단하게 사용 방법을 살펴본다.

( 간략히 하기 위해서 Collectors를 import static을 하였다. )

 

 

 

 

4. 리듀싱 - reducing()

- IntStream에는 매개변수 3개짜리 collect()만 정의되어 있으므로 boxed()를 통해 IntStream을 Stream<Integer>

로 변환해야 매개변수 1개짜리 collect()를 쓸 수 있다.

 

- 아래의 예제를 보고 확실히 이해하자.

 

 

 

 

5. 문자열 결합 - joining()

- 문자열 스트림의 모든 요소를 하나의 문자열로 연결해서 반환한다.

 

- 구분자를 지정해줄 수도 있고, 접두사와 접미사도 지정가능하다.

 

- 주의할 점은 스트림의 요소가 String이나 StringBuffer처럼 Char Sequence의 자손인 경우에만

결합이 가능하다.

 

( 만약 그렇치 않을 경우, map()을 이용해서 변환 후 사용해야 한다. )

 

( 아래의 예제를 보고 확실히 이해하자. )

( 만약 map()을 뺴 버린다면, 해당 스트림의 클래스에 있는 toString()과 결합하게 된다. )