반응형
자바의 스트림은 중간 연산 → 최종 연산의 흐름으로 데이터를 처리하는 파이프라인 구조를 가집니다.
이번 예제에서는 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회용이므로, 한 번 연산에 사용한 스트림은 다시 사용할 수 없습니다.
📌정리하자면, 이번 예제에서는 스트림을 통해 리스트 내부 객체의 데이터를 추출하고,
그 값을 기반으로 평균을 계산하는 흐름을 실습해 보았습니다.
이처럼 스트림은 중간 단계에서 원하는 데이터만 필터링하거나 변환하고,
최종 단계에서 집계나 출력 등 원하는 결과를 도출하는 데 매우 유용한 구조입니다.
'Java > 자바 정리' 카테고리의 다른 글
166. 숫자 범위 스트림 생성하기 – IntStream.rangeClosed()로 합 구하기 (0) | 2025.05.23 |
---|---|
165. 배열로부터 스트림 생성하기 – Arrays.stream() 활용 (0) | 2025.05.23 |
164. 스트림 요소 출력하기 – 객체 리스트 출력 실습 (0) | 2025.05.23 |
162. 병렬 스트림 (Parallel Stream) – 멀티스레드로 스트림 처리하기 (0) | 2025.05.23 |
161. Stream API 시작하기 – 컬렉션 요소 반복 처리 (0) | 2025.05.23 |
160. 생성자 참조(Constructor Reference) – new 키워드도 메서드 참조처럼 사용하기 (0) | 2025.05.22 |