리덕션(Reduction)
: 대량의 데이터를 가공해서 축소 ex) 데이터의 합계, 평균값, 카운팅, 최대값, 최소값 등
: 컬렉션의 요소를 리덕션의 결과물로 바로 집계할 수 없을 경우, 집계하기 좋도록 필터링, 매핑, 정렬, 그룹핑 등의 중간처리가 필요
1. 중간 처리와 최종 처리
파이프라인(pipelines)
: 여러 개의 스트림이 연결되어 있는 구조
: 파이프라인에서 최종 처리를 제외하고는 모두 중간 처리 스트림
Stream 인터페이스에는 필터링, 매핑, 정렬 등의 많은 중간 처리 메소드가 있는데, 이 메소드들은 중간 처리된 스트림을 리턴한다. 이 스트림에서 다시 중간 처리 메소드를 호출해서 파이프라인을 형성하게 된다.
ex) 회원들 중 남자 회원들의 나이 평균 구하기
회원 클래스
package sec03.stream_pipelines_YJ;
public class Member {
public static int MALE = 0;
public static int FEMALE = 1;
private String name;
private int sex;
private int age;
public Member(String name, int sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public int getSex() {
return sex;
}
public int getAge() {
return age;
}
}
스트림 파이프라인
package sec03.stream_pipelines_YJ;
import java.util.Arrays;
import java.util.List;
public class StreamPipelinesExample {
public static void main(String[] args) {
List<Member> list = Arrays.asList(
new Member("홍길동", Member.MALE, 30),
new Member("김나리", Member.FEMALE, 20),
new Member("신용권", Member.MALE, 45),
new Member("박수미", Member.FEMALE, 27)
);
double ageAvg = list.stream()
.filter( m -> m.getSex() == Member.MALE) //성별이 남자인 Member 객체를 요소로 하는 새로운 스트림 생성
.mapToInt( Member :: getAge ) //Member 객체를 age 값으로 매핑
.average() //age 요소들의 평균을 OptionalDouble에 저장
.getAsDouble(); //OptionalDouble에 저장된 평균값을 얻기 위해 getAsDouble() 메소드 호출
System.out.println("남자 평균 나이: " + ageAvg);
}
}
남자 평균 나이: 37.5
2. 중간 처리 메소드와 최종 처리 메소드
스트림이 제공하는 중간 처리용 메소드 - 리턴 타입이 스트림
스트림이 제공하는 최종 처리용 메소드 - 리턴 타입이 기본 타입이거나 OptionalXXX
'Java > 16. 스트림과 병렬 처리' 카테고리의 다른 글
Day 21 : 매핑 (flatMapXXX(), mapXXX(), asXXXStream(), boxed()) (0) | 2021.11.16 |
---|---|
Day 21 : 필터링 (distinct(), filter()) (0) | 2021.11.16 |
Day 21 : 스트림의 종류 (0) | 2021.11.16 |
Day 21 : 스트림의 특징 (0) | 2021.11.16 |
Day 21 : 반복자 스트림 (0) | 2021.11.16 |