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()와 같은 메서드를
사용하면 된다. 아래의 예시를 보자.
- List나 Set이 아닌 특정 컬렉션이라면, 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()과 결합하게 된다. )
'자바 > 스트림' 카테고리의 다른 글
collect() 메서드(3) - groupingBy() (0) | 2022.04.20 |
---|---|
collect() 메서드(2) - partitioningBy() (0) | 2022.04.20 |
스트림의 최종 연산(조건 검사, 통계, 리듀싱) (0) | 2022.04.15 |
Optional<T>와 OptionalInt (0) | 2022.04.15 |
스트림의 중간 연산(3) (0) | 2022.04.14 |