반응형
Java의 Stream API는 데이터 처리를 간결하고 효율적으로 수행할 수 있는 강력한 도구입니다.
이 글에서는 Stream API의 주요 개념과 예제를 통해 이를 마스터하는 방법을 다룹니다.
#1. 샘플데이터 생성
BabyVOX클래스 정의
BabyVOX클래스는 다음과 같은 필드를 포함합니다:
- id (Integer)
- name (String)
- position(String)
- instagramFollowers (Double)
- age (Integer)
@AllArgsConstructor
@Getter
@ToString
static class BabyVOX {
private int id;
private String name;
private String position;
private double instagramFollowers;
private int age;
}
샘플 데이터 초기화
List<BabyVOX> members = Arrays.asList(
new BabyVOX(1, "김이지", "RAP", 13000, 46),
new BabyVOX(2, "이희진", "VOCAL", 20000, 45),
new BabyVOX(3, "심은진", "DANCE", 32000, 44),
new BabyVOX(4, "간미연", "VOCAL", 35000, 42),
new BabyVOX(5, "윤은혜", "VOCAL", 542000, 40)
);
#2. Stream API 예제
1. 조건에 따른 멤버 필터링
특정 조건(예: 팬덤, 포지션 또는 나이)에 따라 멤버를 필터링합니다.
// 팔로워가 50000 이상인 멤버 필터링
List<BabyVOX> highFandom = members.stream()
.filter(e -> e.getInstagramFollowers() >= 50000)
.toList();
log.info("High Fandom: {}", highFandom);
2. 멤버 정렬
팔로워 수나 나이에 따라 멤버를 정렬합니다.
// 팔로워를 기준으로 내림차순 정렬
List<BabyVOX> sortedByFandom = members.stream()
.sorted(Comparator.comparingDouble(BabyVOX::getInstagramFollowers).reversed())
.toList();
log.info("Sorted by Fandom: {}", sortedByFandom);
3. 멤버 이름 매핑
특정 필드(예: 이름)를 추출합니다.
// 모든 멤버 이름을 리스트로 가져오기
List<String> memberNames = members.stream()
.map(BabyVOX::getName)
.toList();
log.info("Member names: {}", memberNames);
4. 합계, 평균, 최소값 및 최대값 계산
숫자 필드(예: 팔로워)에 대해 계산을 수행합니다.
// 총 팔로워 계산
double totalFandom = members.stream()
.mapToDouble(BabyVOX::getInstagramFollowers)
.sum();
log.info("Total fandom: {}", totalFandom);
// 평균 팔로워 계산
double averageFandom = members.stream()
.mapToDouble(BabyVOX::getInstagramFollowers)
.average()
.orElse(0.0);
log.info("Average fandom: {}", averageFandom);
// 팔로워 수가 가장 많은 멤버 찾기
BabyVOX highestFandom = members.stream()
.max(Comparator.comparingDouble(BabyVOX::getInstagramFollowers))
.orElse(null);
log.info("Highest fandom: {}", highestFandom);
5. 포지션별 멤버 그룹화
멤버를 포지션별로 그룹화합니다.
// 포지션 별 멤버 그룹화
Map<String, List<BabyVOX>> membersByPosition = members.stream()
.collect(Collectors.groupingBy(BabyVOX::getPosition));
log.info("Member by position: {}", membersByPosition);
6. 팔로워 기준으로 멤버 분류
특정 팔로워 조건에 따라 멤버를 분류합니다.
// 팔로워가 30000 명 이상인지 여부로 멤버 분류
Map<Boolean, List<BabyVOX>> partitionedByFandom = members.stream()
.collect(Collectors.partitioningBy(e -> e.getInstagramFollowers() > 30000));
log.info("Partitioned by Fandom > 30000: {}", partitionedByFandom);
7. 포지션별 멤버 수 세기
각 포지션의 멤버 수를 계산합니다.
// 포지션별 멤버 수 세기
Map<String, Long> countByPosition = members.stream()
.collect(Collectors.groupingBy(BabyVOX::getPosition, Collectors.counting()));
log.info("Count by position: {}", countByPosition);
8. 조건 확인 (모두 만족 / 일부 만족 / 아무도 만족하지 않음)
멤버들이 특정 조건을 모두 만족하는지, 일부만 만족하는지 또는 아무도 만족하지 않는지 확인합니다.
// 모든 멤버가 팔로워가 10000명 이상인지 확인
boolean allHighFandom = members.stream()
.allMatch(e -> e.getInstagramFollowers() > 10000);
log.info("All members fandom > 50000: {}", allHighFandom);
// 댄스 포지션에 멤버가 있는지 확인
boolean anyInDANCE = members.stream()
.anyMatch(e -> e.getPosition().equals("DANCE"));
log.info("Any members in DANCE: {}", anyInDANCE);
9. 축약 (합계 또는 사용자 정의 집계)
reduce를 사용하여 합계 또는 사용자 정의 집계를 수행합니다.
// reduce를 사용하여 총 팔로워 계산
double sumFollowers = members.stream()
.map(BabyVOX::getInstagramFollowers)
.reduce(0.0, Double::sum);
log.info("Sum of Followers (reduce): {}", sumFollowers);
10. 사용자 정의 Collector 생성
필요에 따라 사용자 정의 Collector를 생성할 수 있습니다. 예를 들어, 모든 멤버 이름을 하나의 문자열로 결합합니다.
// 모든 멤버 이름을 하나의 문자열로 결합
String concatenatedNames = members.stream()
.map(BabyVOX::getName)
.collect(Collectors.joining(", "));
log.info("Concatenated names: {}", concatenatedNames);
11. 가장 나이가 많거나 어린 멤버 찾기
min 및 max 함수를 사용하여 나이를 기준으로 직원을 찾습니다.
// 가장 나이가 많은 멤버 찾기
BabyVOX oldestMember = members.stream()
.max(Comparator.comparingInt(BabyVOX::getAge))
.orElse(null);
log.info("Oldest member: {}", oldestMember);
#3. 실행 결과
위 예제들을 통해 Java Stream API의 다양한 기능을 활용할 수 있습니다.
반응형
'Java' 카테고리의 다른 글
if-else vs switch vs enum 처리 속도 비교 (0) | 2025.02.03 |
---|---|
[List] ArrayList 와 LinkedList (0) | 2021.03.18 |
댓글