PHpullh
학습 라이브러리/Java/커스텀 Collector와 함수형 집계

JAVA · 함수형/Stream

커스텀 Collector와 함수형 집계

함수형 프로그래밍 관점에서 Collector를 활용한 데이터 집계를 다룹니다.

함수형/Stream고급Collectorteeingfiltering함수형집계

핵심 설명

함수형 프로그래밍 관점에서 Collector를 활용한 데이터 집계를 다룹니다.

Java code

import java.util.*;
import java.util.stream.*;

public class FPCollector {
    record Transaction(String type, double amount) {}

    public static void main(String[] args) {
        List<Transaction> txns = List.of(
            new Transaction("입금", 50000),
            new Transaction("출금", 20000),
            new Transaction("입금", 30000),
            new Transaction("출금", 10000),
            new Transaction("입금", 45000)
        );

        // 타입별 합계를 한 번의 스트림으로
        Map<String, DoubleSummaryStatistics> summary = txns.stream()
            .collect(Collectors.groupingBy(
                Transaction::type,
                Collectors.summarizingDouble(Transaction::amount)));

        summary.forEach((type, stats) ->
            System.out.printf("%s: 합계=%.0f, 평균=%.0f, 건수=%d%n",
                type, stats.getSum(), stats.getAverage(), stats.getCount()));

        // teeing — 두 Collector 결과 합치기 (Java 12+)
        String report = txns.stream().collect(
            Collectors.teeing(
                Collectors.filtering(t -> t.type().equals("입금"),
                    Collectors.summingDouble(Transaction::amount)),
                Collectors.filtering(t -> t.type().equals("출금"),
                    Collectors.summingDouble(Transaction::amount)),
                (income, expense) -> String.format(
                    "입금: %.0f, 출금: %.0f, 잔액: %.0f",
                    income, expense, income - expense)
            ));
        System.out.println(report);
    }
}

학습 팁

Collectors.teeing()(Java 12+)은 하나의 스트림에서 두 가지 집계를 동시에 수행할 때 유용합니다.

주의할 점

Collectors.filtering()은 Java 9+에서 추가되었습니다. 이전 버전에서는 stream().filter().collect()를 사용하세요.

자주 묻는 질문

커스텀 Collector와 함수형 집계란 무엇인가요?

함수형 프로그래밍 관점에서 Collector 를 활용한 데이터 집계를 다룹니다.

커스텀 Collector와 함수형 집계 학습 시 주의할 점은 무엇인가요?

Collectors.filtering() 은 Java 9+에서 추가되었습니다. 이전 버전에서는 stream().filter().collect() 를 사용하세요.