카테고리 없음
스트림 파이프라인(중간 처리,최종 처리)
연93
2022. 10. 29. 13:56
리덕션(Reduction)
대량의 데이터를 가공해서 축소하는것(합계,평균,카운팅,최대값,최소값)
요소가 리덕션의 결과물로 바로 집계할 수 없을 경우 중간 처리가 필요하다.(필터링,매핑,정렬,그룹핑)
중간 처리한 요소를 최종 처리해서 리덕션 결과물을 산출한다
최종 스트림의 집계 기능이 시작되기 전까지 중간 처리는 지연된다.
최종 스트림이 시작하면 비로소 컬렉션에서 요소가 하나씩 중간 스트림에서 처리되고 최종 스트림까지 오게된다.
public class Member {
public static int MALE = 0; // public static final 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;
}
//Getter메소드
public int getSex() {
return sex;
}
public int getAge() {
return age;
}
}
import java.util.Arrays;
import java.util.List;
public class StreamPipelinesExample {
public static void main(String[] args) {
//1)소스(데이터)
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)
);
int sumAge = 0;
int count = 0;
for(int i=0; i<list.size(); i++) {
if(list.get(i).getSex() == Member.MALE) {
count++;
sumAge += list.get(i).getAge();
}
}
System.out.println("평균 남자 나이: " + (sumAge / (double)count));
//성별이 남자인 데이타에 한하여 나이평균?
//2)스트림생성->중간처리->최종처리(결과)
double average = list.stream() // 4개 Member객체를 참조
.filter(m -> m.getSex() == Member.MALE) // 남자인 2개의 Member객체를 참조. Predicate함수적인터페이스.(매개변수 있고, 리턴값이 boolean. 매개변수를 이용한 조건식)
.mapToInt(m -> m.getAge()) //나이를 매핑한 중간처리. ToIntFunction함수적 인터페이스.(매개변수 있고, 리턴값이 매개변수를 이용한 매핑작업)
.average()
.getAsDouble();
System.out.println("남자 평균이 나이: " + average); // 2
}
}