리덕션(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

+ Recent posts