본문 바로가기

Java/공부공부

[Java] Stream API (Collectors 클래스)

 

[ Stream API ]

java.util.stream 패키지에 포함. java 8 부터 추가.

데이터의 흐름을 다루기 위한 추상화 계층을 제공하며, 이를 통해 데이터의 필터링, 매핑, 정렬, 집계와 같은 작업을 함수형 프로그래밍 방식으로 수행할 수 있다.

 

[ 종류 ]

 - Stream<T> : 일반적인 객체 스트림

 - IntStream, LongStream, DoubleStream : 기본형(int, long, double)에 특화된 스트림.

 

[ 주요 메소드 ]

* 중간 작업 (Intermediate Operations) 

  - filter() : 조건에 맞는 요소를 필터링.

  - map() : 각 요소를 변환하여 새로운 스트림 생성.

  - sorted() : 요소 정렬.

  - distinct() : 중복 요소 제거.

 

* 최종 작업 (Terminal Operations)

  - forEach() : 각 요소에 대해 특정 동작 수행.

  - collect() : 리스트, 셋, 맵 등 컬렉션 형태로 결과 반환.

  - reduce() : 누적 연산을 통해 하나의 결과 생성.

  - count(), findFirst(), findAny() : 요소 수나 특정 요소를 반환.

 


 

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave", "Alice");

        // Stream을 이용하여 필터링 및 수집
        List<String> result = names.stream()
                .distinct()                       // 중복 제거
                .filter(name -> name.length() > 3) // 이름 길이가 3 이상인 것만 필터링
                .sorted()                         // 정렬
                .collect(Collectors.toList());    // List로 수집

        System.out.println(result); // 결과 출력
    }
}

names.stream() 을 호출 => 스트림 생성

distinct(), filter(), sorted()  중간 작업 수행. => 스트림 변환

collect()  최종 작업 수행. => 스트림 사용

 


 

[ Collectors ]

java.util.stream.Collectors 에서 제공하는 클래스, stream API와 함께 사용하여 스트림의 결과를 쉽게 가공.

 

 - toList() : 스트림의 요소들을 List로 수집.

List<String> list = stream.collect(Collectors.toList());

 

- toSet() : 스트림의 요소들을 Set으로 수집. (중복값 제거)

Set<String> set = stream.collect(Collectors.toSet());

 

- toMap() : 스트림의 요소들을 키-값 쌍으로 Map에 수집.

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");

Map<Integer, String> map = names.stream()
                                .collect(Collectors.toMap(
                                    String::length,        // 키 생성: 문자열의 길이
                                    Function.identity()    // 값 생성: 문자열 자체
                                    // name -> name		// 값생성을 람다식으로 표현  
                                ));

 

::  메소드 참조 연산자

특정 메소드나 생성자를 간결하게 참조하는 표현식. 람다 표현식의 단순화를 위해 자주 사용. (불필요한 매개변수 제거)

클래스이름::메소드이름   or  참조변수이름::메소드이름

 

 - joining() : 스트림의 문자열 요소를 하나로 이어 붙임. 

String result = stream.collect(Collectors.joining(", ", "[", "]"));

 

 - groupingBy() : 스트림의 요소를 특정 기준에 따라 그룹화하여 Map으로 반환.

Map<Integer, List<String>> groupedByLength = stream.collect(
    Collectors.groupingBy(String::length) // 문자열 길이로 그룹화
);

 

 - partitioningBy() : 스트림의 요소를 조건에 따라 두 개의 그룹으로 나누어 Map으로 반환.

Map<Boolean, List<String>> partitioned = stream.collect(
    Collectors.partitioningBy(s -> s.length() > 3) // 길이가 3보다 큰지 여부로 분할
);

 

 - counting() : 스트림의 요소 개수 카운트.

long count = stream.collect(Collectors.counting());

 

 - summarizingInt() : 스트림의 요소에서 int형 값의 요약 통계를 계산. (합계, 평균, 최대, 최소)

IntSummaryStatistics stats = stream.collect(Collectors.summarizingInt(String::length));