Java_33_Stream·람다식

OngTK·2025년 9월 29일

Java

목록 보기
33/35

Java Stream과 람다식 정리 ✨


1. 람다식 개요

  • 정의: 메서드를 하나의 식으로 표현한 것 (익명 함수)
  • 형식: (매개변수) -> { 실행문 }
  • 장점: 코드 간결, 함수형 프로그래밍 가능, Stream API와 함께 사용

예시:

(x, y) -> x + y       // 두 수의 합
s -> s.length()       // 문자열 길이 반환
() -> System.out.println("Hello") // 매개변수 없는 경우

2. 람다 표현식 심화

2.1 정의

  • 익명 함수를 간결하게 표현하는 방법
  • Java 8 이상에서 도입

2.2 목적

  • 메서드 선언 없이 구현부만 간단히 작성 가능
  • 코드의 간결성, 가독성 향상

2.3 사용처

  1. Stream API
  2. Java GUI (이벤트 리스너 등)

2.4 주요 함수형 인터페이스

  • Function<T, R>

    • 입력 T → 출력 R
    • .apply(T) 실행
    Function<String, Integer> length = s -> s.length();
    System.out.println(length.apply("Hello")); // 5
  • Supplier<T>

    • 입력 없음 → 결과 T
    • .get() 실행
    Supplier<Double> random = () -> Math.random();
    System.out.println(random.get());
  • Consumer<T>

    • 입력 T → 반환 없음
    • .accept(T) 실행
    Consumer<String> printer = s -> System.out.println(s);
    printer.accept("Hello Consumer");
  • Predicate<T>

    • 입력 T → boolean 반환
    • .test(T) 실행
    Predicate<Integer> isEven = x -> x % 2 == 0;
    System.out.println(isEven.test(4)); // true

2.5 활용

  1. 추상 메소드 구현체를 간단히 작성할 때
  2. 컬렉션 프레임워크, Stream API와 함께 사용

3. Stream API 개요

  • 정의: 컬렉션, 배열 등의 데이터를 함수형 스타일로 처리할 수 있는 API
  • 특징
    • 선언형 프로그래밍 → 반복문 대신 데이터 처리 과정을 "선언"
    • 중간 연산(가공) + 최종 연산(결과 도출) 구조
    • 내부 반복 (반복문을 직접 작성하지 않아도 됨)

4. Stream 주요 연산과 예제

4.1 forEach (최종 연산)

  • 각 요소를 순회하면서 출력하거나 처리
  • 반환값 없음
numbers.stream().forEach(x -> System.out.println("[1] " + x));

4.2 map (중간 연산) + collect (최종 연산)

  • 요소 변환 후 새로운 컬렉션 반환
List<Integer> doubled = numbers.stream()
                               .map(x -> x * 2)
                               .collect(Collectors.toList());
System.out.println("[2] " + doubled);

4.3 map (중간 연산) + forEach (최종 연산)

  • 변환 후 바로 출력
numbers.stream()
       .map(x -> x * 2)
       .forEach(x -> System.out.println("[3] " + x));

4.4 filter (중간 연산)

  • 조건에 맞는 요소만 필터링
numbers.stream()
       .filter(x -> x % 2 == 0)
       .forEach(x -> System.out.println("[4] " + x));

4.5 sorted (중간 연산)

  • 정렬 처리 (기본 오름차순, Comparator로 내림차순 가능)
numbers.stream().sorted()
       .forEach(x -> System.out.println("[5.1] " + x)); // 오름차순

numbers.stream().sorted(Comparator.reverseOrder())
       .forEach(x -> System.out.println("[5.2] " + x)); // 내림차순

4.6 distinct (중간 연산)

  • 중복 제거
List<Integer> unique = numbers.stream().distinct().collect(Collectors.toList());
System.out.println("[6] " + unique);

4.7 limit (중간 연산)

  • 처음부터 N개까지만 추출
numbers.stream().limit(5).forEach(x -> System.out.println("[7] " + x));

4.8 reduce (최종 연산)

  • 누적 연산으로 합계, 곱, 최소, 최대 계산 가능
int sum = numbers.stream().reduce(0, (x, y) -> x + y);
System.out.println("[8.1] 합계 = " + sum);

int product = numbers.stream().reduce(1, (x, y) -> x * y);
System.out.println("[8.2] 곱 = " + product);

int min = numbers.stream().reduce(Integer.MAX_VALUE, (x, y) -> x < y ? x : y);
System.out.println("[8.3] 최소값 = " + min);

int max = numbers.stream().reduce(0, (x, y) -> x > y ? x : y);
System.out.println("[8.4] 최대값 = " + max);

5. 실무 활용 팁

  • 컬렉션 가공 시 반복문보다 Stream 사용하면 코드 간결
  • 람다식은 익명 함수이므로 불필요한 클래스 선언 줄일 수 있음
  • 성능 고려: 데이터가 방대하면 parallelStream() 사용 가능 (단, 항상 빠른 건 아님)
  • 가독성: 너무 긴 체이닝은 오히려 불편 → 적절히 메서드 분리 필요
  • 함수형 인터페이스와 함께 쓰면 표준화된 코드 작성 가능

⚡ 정리:
Java 람다식은 메서드를 간단히 표현하는 문법이고, Stream API는 데이터를 함수형 스타일로 처리하는 도구임.
두 개념을 함께 사용하면 코드가 짧아지고 유지보수가 쉬워짐.

profile
2025.05.~K디지털_풀스택 수업 수강중

0개의 댓글