반응형
자바의 스트림 API에서는 합계, 평균, 최대값 등 다양한 집계 연산을 제공하며,
sum()처럼 간편한 메서드도 있지만 보다 유연하게 처리할 수 있는 reduce()도 존재합니다.
이번 예제에서는 두 방식으로 학생 점수의 합계를 구하는 방법을 비교해보겠습니다.
📦 Student.java
package ch17.sec11;
public class Student {
private String name;
private int score;
public Student(String name, int score){
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
📌 예제 코드
package ch17.sec11;
import java.util.Arrays;
import java.util.List;
public class ReductionExample {
public static void main(String[] args) {
List<Student> list = Arrays.asList(
new Student("홍길동", 92),
new Student("파이썬", 95),
new Student("김자바", 88)
);
// 방법 1: mapToInt + sum()
int sum = list.stream()
.mapToInt(Student::getScore)
.sum();
System.out.println("sum1 : " + sum);
// 방법 2: map + reduce()
sum = list.stream()
.map(Student::getScore)
.reduce(0, (a, b) -> a + b);
System.out.println("sum2 : " + sum);
}
}
💻 실행 결과
sum1 : 275
sum2 : 275
💬 코드 설명
- mapToInt(Student::getScore).sum()
→ IntStream으로 변환 후 내장된 합계 메서드를 사용합니다. 가장 간결하고 빠릅니다. - map(Student::getScore).reduce(0, (a, b) -> a + b)
→ 점수만 추출 후 reduce()를 통해 초깃값 0에서 시작하여 누적합니다.
(a, b) -> a + b는 합계를 누적하는 람다식입니다.
💡 포인트 정리
- sum()은 기본형 스트림(IntStream 등) 에서만 제공되며, 가장 빠르고 간편합니다.
- reduce(identity, accumulator)는 모든 스트림 타입에서 사용 가능하며,
다양한 누적 연산(곱셈, 문자열 합치기 등)에도 응용할 수 있습니다. - reduce()는 직접 연산식을 지정하기 때문에 유연한 집계 처리가 가능합니다.
📌정리하자면, 이번 예제에서는 학생 객체 리스트를 스트림으로 변환한 뒤
sum()과 reduce() 두 가지 방식으로 점수의 총합을 구해보았습니다.
간단한 합계에는 sum()이 편리하고, 더 복잡한 누적 연산에는 reduce()가 유리하다는 점을 기억해두시면 좋습니다.
'Java > 자바 정리' 카테고리의 다른 글
181. groupingBy() + averagingDouble() – 그룹별 평균 구하기 (1) | 2025.05.27 |
---|---|
180. groupingBy()를 사용한 스트림 분류 – 성별로 그룹화하기 (0) | 2025.05.26 |
179. 스트림 결과 수집하기 – toList()와 Collectors.toMap() 활용 (0) | 2025.05.26 |
177. Optional로 평균 처리하기 – isPresent, orElse, ifPresent 활용 (0) | 2025.05.26 |
176. 스트림 집계(Aggregate) 연산 – count, sum, average, max, min, findFirst (0) | 2025.05.26 |
175. 스트림 요소 조건 검사 – allMatch, anyMatch, noneMatch (0) | 2025.05.26 |