Java/자바 정리

163. 스트림 파이프라인 – 중간 연산과 최종 연산으로 평균 계산하기

코딩하는냥이 2025. 5. 23. 11:01
반응형

자바의 스트림은 중간 연산 → 최종 연산의 흐름으로 데이터를 처리하는 파이프라인 구조를 가집니다.
이번 예제에서는 Student 객체 리스트에서 점수만 추출한 뒤,
스트림을 통해 평균 점수를 구하는 과정을 실습해보겠습니다.


📦 Student.java

package ch17.sec03;

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.sec03;

import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamPipeLineExample {
	public static void main(String[] args) {
		List<Student> list = Arrays.asList(
			new Student("홍길동", 10),
			new Student("신용권", 20),
			new Student("김자바", 30)
		);

		// 스트림을 변수로 나눠서 처리
		Stream<Student> studentStream = list.stream();
		IntStream scoreStream = studentStream.mapToInt(Student::getScore);
		double avg = scoreStream.average().getAsDouble();
		System.out.println("평균 점수 : " + avg);

		// 스트림 파이프라인을 한 줄로 처리
		avg = list.stream()
				.mapToInt(Student::getScore)
				.average()
				.getAsDouble();
		System.out.println("평균 점수 : " + avg);
	}
}

💻 실행 결과

평균 점수 : 20.0
평균 점수 : 20.0

💬 코드 설명

  • Student 클래스는 이름과 점수를 저장하는 간단한 데이터 객체입니다.
  • list.stream()을 통해 학생 리스트를 스트림으로 변환합니다.
  • mapToInt(Student::getScore)는 중간 연산으로, 각 학생의 점수를 IntStream으로 추출합니다.
  • average()는 최종 연산으로, 평균을 계산하며 결과는 OptionalDouble로 반환됩니다.
  • getAsDouble()을 통해 평균 값을 실수형으로 출력합니다.
  • 동일한 흐름을 한 줄 스트림 파이프라인으로도 작성할 수 있어 더욱 간결합니다.

💡 포인트 정리

  • 중간 연산: .mapToInt(...) – 요소 변환, 필터링 등 데이터를 가공
  • 최종 연산: .average() – 결과를 도출 (이 외에도 sum, count, collect 등이 있음)
  • OptionalDouble.getAsDouble()은 값이 존재한다고 가정할 때 사용 (실무에서는 isPresent() 체크도 필요)
  • 스트림은 1회용이므로, 한 번 연산에 사용한 스트림은 다시 사용할 수 없습니다.

📌정리하자면, 이번 예제에서는 스트림을 통해 리스트 내부 객체의 데이터를 추출하고,
그 값을 기반으로 평균을 계산하는 흐름을 실습해 보았습니다.
이처럼 스트림은 중간 단계에서 원하는 데이터만 필터링하거나 변환하고,
최종 단계에서 집계나 출력 등 원하는 결과를 도출하는 데 매우 유용한 구조입니다.