collect()와 Collectors
- collect()는 스트림의 요소를 수집하는 최종 연산으로 앞서 배운 리듀싱 (reducing)과 유사하다.
- collect()가 스트림의 요소를 수집하려면, 어떻게 수집할 것인가에 대한 방법이 정의되어 있어야 하는데 이 방법을 정의한 것인 바로 컬렉터(collector)이다.
- 컬렉터는 Collector인터페이스를 구현한 것이다.
- Collectors클래스는 미리 작성된 다양한 종류의 컬렉터를 반환하는 static메서드를 가지고 있다.
collect() 스트림의 최종연산. 매개변수로 컬렉터를 필요로 한다.
Collector 인터페이스, 컬렉터는 이 인터페이스를 구현해야한다.
Collectors 클래스, static메서드로 미리 작성된 컬렉터를 제공한다.
- collect()는 매개변수의 타입이 Collector인데,매개변수가 Collector를 구현한 클래스의 객체이어야 한다는 뜻이다. 그리고 collect()는 이 객체에 구현된 방법대로 스트림의 요소 를 수집한다
스트림을 컬렉션과 배열로 변환- toList(),toSet( ),toMap( ),toCollection( ),toArray()
- 스트림의 모든 요소를 컬렉션에 수집하려면, Collectors클래스의 toList()와 같은 메서드를 사용하면 된다.
- List나 Set이 아닌 특정 컬렉션을 지정하려면, toCollection()에 해당 컬렉션의 생성자 참조를 매개변수로 넣어주면 된다.
- Map은 키와 값의 쌍으로 저장해야하므로 객체의 어떤 필드를 키로 사용할지와 값으로 사용할지를 지정해줘야 한다.
- 예시화면과같이 요소의 타입이 Person인 스트림에서 사람의 주민번호(regld)를 키로 하고, 값으로 Person객체를 그대로 저장하는 식이다.
- 스트림에 저장된 요소들을 'T[ ]’타입의 배열로 변환하려면, toArray()를 사용하면 된다.
- 단, 해당 타입의 생성자 참조를 매개변수로 지정해줘야 한다.
- 만일 매개변수를 지정하지 않았다면, 반환받는 배열의 타입은 'Object[ ]’이다.
통계 - counting(), summinglnt(), averaginglnt( ),maxBy(), minBy()
- 앞서 살펴보았던 최종 연산들이 제공하는 통계 정보를 collectO로 똑같이 얻을 수 있다.
- 이후groupingBy()와 함께 사용할 때 해당 메서드들이 유용하게 쓰인다. 그룹별로 통계정보를 얻을 수 있기 때문이다.
- counting()앞에는 Collectors가 생략되어있고 제대로 쓴다면 Collectors.counting() 로 작성해야 한다.
- 보다 간결한 코드를 위해 Collectors의 static메서드를 호출할 때는 ‘Collectors.’를 생략하였다.
- static import되어 있다고 가정하자.
리듀싱 - reducing()
- 리듀싱 역시 collect()로 가능하다
- collect()의 reducing은 앞선 reduce()와는 달리 '그룹별로' 리듀싱이 가능하다는 차이점이 있다.
- 전자는 전체에 대한 리듀싱만 가능하다.
'Programming > JAVA' 카테고리의 다른 글
자바의 정석 ch14-40~44 : 스트림의 최종연산 (0) | 2023.05.02 |
---|---|
자바의 정석 ch14-35~39 : Optional<T> (0) | 2023.04.28 |
자바의 정석 ch 14-30~34 : 스트림의 중간연산 (2) (0) | 2023.04.26 |
자바의 정석 ch14-26~29 : 스트림의 중간연산(1) (0) | 2023.04.25 |
자바의 정석 ch14-23~25 : 스트림의 연산 (0) | 2023.04.25 |