[Java] 람다(Lambda)와 스트림(Stream) API 개념 및 예제

2025. 1. 7. 16:34·TIL (Today I Learned)

람다(Lambda)

1. 람다(Lambd) 표현식

람다 표현식(Lambda Expression)은 익명 함수를 생성하기 위한 간결한 문법으로, Java 8에서 도입되었다.

  • 코드의 간결성과 가독성을 높임
  • 주로 함수형 인터페이스(Functional Interface)와 함께 사용
✏️ 함수형 인터페이스 (Functional Interface)
Java에서 함수형 인터페이스는 단 하나의 추상 메서드만 가지는 인터페이스를 의미한다.
람다 표현식이나 메서드 참조를 지원하는 기반이다.

2. 기본 문법

(매개변수) -> { 실행문 }
  1. 매개변수 : 함수에 전달할 값. 매개변수가 1개면 괄호 생략 가능
  2. -> : 람다 표현식의 매개변수와 실행문을 구분
  3. 실행문 : 메서드의 본문으로, 한 줄일 경우 중괄호{} 생략 가능

3. 람다 표현식 예제

람다를 사용하면 불필요한 코드(클래스 선언, 메서드 명 등)를 줄일 수 있다.

 

Thread Runnable 객체 생성 예시

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Runnable 실행");
    }
};
new Thread(runnable).start();
  • Runnable 객체를 익명 클래스 형태로 생성

 

Runnable runnable = () -> System.out.println("Runnable 실행");
new Thread(runnable).start();
  • Runnable을 람다 표현식으로 간단히 정의

4. 함수형 인터페이스와의 관계

함수형 인터페이스는 인터페이스에 단 하나의 추상 메서드만 정의되어야 한다.

람다 표현식으로 함수형 인터페이스의 추상 메서드를 구현할 수 있다.

 

함수형 인터페이스 예제

@FunctionalInterface
interface Calculator {
    int operate(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        // 람다 표현식을 사용하여 Calculator 구현
        Calculator add = (a, b) -> a + b;
        Calculator multiply = (a, b) -> a * b;

        System.out.println("덧셈 결과: " + add.operate(5, 3));      // 출력: 8
        System.out.println("곱셈 결과: " + multiply.operate(5, 3)); // 출력: 15
    }
}


스트림(Stream) API

1. 스트림(Stream) API

Java 8에서 도입된 Stream API는 데이터를 처리하는 데 있어 함수형 프로그래밍 스타일을 제공한다.

스트림은 java.util.stream 패키지에 포함된 API이며 데이터를 처리하기 위한 연산의 집합(filter, map, collect 등)을 제공한다.

  • 데이터를 순차적 또는 병렬적으로 처리할 수 있다.
  • 데이터를 처리하는 파이프라인을 형성하여 간결하고 효율적인 코드를 작성할 수 있다.

 

특징

  1. 데이터 소스(컬렉션, 배열 등)에서 데이터를 추출하여 처리
  2. 데이터를 필터링, 변환, 집계하는 연산 제공
  3. 중간 연산과 최종 연산으로 구성
        - 중간 연산 : 스트림 변환 (filter, map)
        - 최종 연산 : 스트림을 결과로 변환 (forEach, collect)
  4. 스트림은 한 번 소비되면 재사용 불가

2. 스트림의 주요 메서드

  • 중간 연산
        - filter(Predicate) : 조건에 맞는 요소 필터링
        - map(Function) : 각 요소를 변환
        - sorted() : 요소를 정렬
  • 최종 연산
        - forEach(Comsumer) : 각 요소를 소비
        - collect() : 결과를 컬렉션으로 반환
        - reduce() : 요소를 하나의 값으로 줄임

3. 스트림 API 예제

데이터 필터링과 변환

import java.util.Arrays;
import java.util.List;

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

        // 이름이 "A"로 시작하는 요소 필터링 및 변환
        names.stream()
             .filter(name -> name.startsWith("A"))
             .map(String::toUpperCase)
             .forEach(System.out::println); // 출력: ALICE
    }
}

 

숫자 데이터의 집계

import java.util.stream.IntStream;

public class StreamSumExample {
    public static void main(String[] args) {
        int sum = IntStream.range(1, 6) // 1부터 5까지의 숫자
                           .sum();      // 합산
        System.out.println("Sum: " + sum); // 출력: Sum: 15
    }
}

 

리스트 정렬 및 수집

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

public class StreamSortExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);

        // 정렬 후 수집
        List<Integer> sortedNumbers = numbers.stream()
                                             .sorted()
                                             .collect(Collectors.toList());
        System.out.println(sortedNumbers); // 출력: [1, 2, 3, 4, 5]
    }
}

4. 람다와 스트림 API

import java.util.Arrays;
import java.util.List;

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

        // 스트림 API + 람다
        names.stream()
             .filter(name -> name.startsWith("A")) // filter 메서드는 API
             .map(String::toUpperCase)             // map 메서드는 API
             .forEach(System.out::println);        // forEach 메서드는 API
    }
}
  • stream(), filter(), map(), forEach() 는 스트림 API에서 제공하는 메서드
  • 람다 표현식 name -> name.startWith("A")을 스트림 API와 결합하여 동작
저작자표시 비영리 변경금지 (새창열림)

'TIL (Today I Learned)' 카테고리의 다른 글

[Java] 스택 자료구조: Stack과 Deque 비교  (0) 2025.01.10
[TIL] Java 계산기 만들기 과제 회고 🤓✏️  (0) 2025.01.09
[TIL] Java Enum과 Generic 활용하여 계산기 만들기 (25-01-06)  (1) 2025.01.06
[Java] Generic의 원리와 활용법  (0) 2025.01.06
[Java] Enum 사용법과 활용 예시  (0) 2025.01.06
'TIL (Today I Learned)' 카테고리의 다른 글
  • [Java] 스택 자료구조: Stack과 Deque 비교
  • [TIL] Java 계산기 만들기 과제 회고 🤓✏️
  • [TIL] Java Enum과 Generic 활용하여 계산기 만들기 (25-01-06)
  • [Java] Generic의 원리와 활용법
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    jpa
    그리디
    greedy
    bootstrap
    BOJ
    CSS
    자료구조
    완전탐색
    join
    dp
    javascript
    Subquery
    GROUP BY
    프로그래머스
    BFS
    다이나믹프로그래밍
    jQuery
    mysql
    백준
    Google Fonts
    DFS
    sql
    백트래킹
    jwt
    HTML
    programmers
    java
    시뮬레이션
    Firebase
    websocket
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
[Java] 람다(Lambda)와 스트림(Stream) API 개념 및 예제
상단으로

티스토리툴바