본문 바로가기
Java

예제로 알아보는 Java Stream API

by 오이가지아빠 2025. 2. 7.
반응형

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

댓글