공부 기록/Java with ChatGPT

[Java/ChatGPT] Day 17: 람다식 (Lambda) & 스트림 (Stream)

dev.jelee 2025. 7. 9. 20:54

[ 학습목표 ]

  1. 람다식의 기본 문법과 사용 이유를 이해한다.
  2. 함수형 인터페이스를 알아본다.
  3. 스트림(Stream)을 이용한 컬렉션 처리 방법을 학습한다.
  4. 기존의 for문/if문을 더 간결한 코드로 대체할 수 있다.

[ 이론 ]

1. 람디식이란?

메서드를 하나의 식(Expression)으로 표현한 것.

불필요한 코드를 줄이고 나결하게 로직을 전달할 수 있다.


2. 람다식 기본 문법

(매개변수) -> { 실행문 }

3. 람다식 예제

// 기본 형태
Runnable r = () -> System.out.println("Hello Lambda!");
r.run(); // Hello Lambda! 출력

// 매개변수 있는 경우
Consumer<String> c = (s) -> System.out.println("입력값: " + s);
c.accept("테스트");

// Comparator 예시 (기존 익명 클래스 대체)
Comparator<String> comp = (s1, s2) -> s1.length() - s2.length();

4. 함수형 인터페이스란?

단 하나의 추상 메서드만 가지는 인터페이스.

-> 자바에서 람다식을 쓸 수 있게 해주는 전제 조건


5. 함수형 인터페이스 예시

@FunctionalInterface
interface MyFunction {
	void run();
}

6. 자주 사용하는 함수형 인터페이스 (java.util.function 패키지)

인터페이스 설명
Consumer<T> 입력 받고 반한 없음 (void)
Supplier<T> 입력 없고 반환만 있음
Function<T, R> T를 받아서 R로 변환
Predicate<T> T를 받아 boolean 반환

7. Stream이란?

컬렉션(List, Set 등)을 반복, 필터, 정렬, 집계 등

선언형 방식으로 처리하는 도구


8. Stream 예시

List<String> list = List.of("Java", "Spring", "Lambda", "Stream");

list.stream()
	.filter(s -> s.length() > 5)
    .sorted()
    .forEach(System.out::println);
.// of() 메서드
불변(immutable) 리스트를 생성.
한 번 생성된 리스트는 요소 추가/삭제/변경이 불가하다.
Java 9 이후 사용 가능.
Java 8까지는 Arrays.asList() 사용

// System.out::print
메서드 참조 방식
x -> Stream.out.println(x) 이런 람다식을 더 간단하게 표현한 것.

9. 보충 학습 키워드

  • map(), collect(Collectors.toList()), reduce(), Optional -> 스트림 고급
  • 실무에서는 스트림이 SQL처럼 데이터를 다루는 데 강력하게 사용됨

[ 실습 ]

✅ 실습 예제 1: 문자열 길이순 정렬

import java.util.*;

public class Main {
	public static void main(String[] args) {
    	List<String> words = Arrays.asList("Java", "Stream", "Lambda", "API", "Function");
        
        // 문자열 길이 기준 오름차순 정렬
        words.sort( (a,b) -> a.length() - b.length() );
        
        for (String word : words) {
        	System.out.println(word);
        }
    }
}

✅ 실습 예제 2: 숫자 필터링 + 출력

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

public class Main {
	public static void main(String[] args) {
    	List<Integer> numbers = List.of(1, 5, 10, 15, 20, 25);
        
        // 10 이상인 수만 필터링해서 출력
        numbers.stream()
        	.filter(n -> n >= 10)
            .forEach(System.out::println);
    }
}

[ 과제 ]

✅ 과제 1: 문자열 리스트를 스트림으로 필터링

이 중에서 5글자 이상인 동물 이름만 출력해보세요 (람다 & Stream 사용)

List<String> animals = List.of("cat", "tiger", "lion", "elephant", "dog");

✅ 과제 2: Book 리스트 정렬

기존에 만들었던 Book 객체를 다시 활용해서:

  • 출판 연도 기준 정렬 (람다식 사용)
  • 제목 기준 정렬 (람다식 사용)

[ 메모 ]

  • 람디식은 (매개변수) -> { 실행문 } 이 기본문법
  • .stream()을 사용해서 Comporator 할 수 있고, 조건을 주어 필터링도 할 수 있다.
  • .of() 메서드는 Java9 이후부터 사용가능. 그리고 값이 불변함. (값 수정x)
    Java8 까지는 Arrays.asList() 로 사용.
  • System.out::println 이건 메서드 참조 방식. 람다식을 더 간단하게 표현한 것.
  • 함수여 인터페이스는 단 하나의 추상 메서드만 가질 수 있다. @FunctionalInterface 붙여야함.