람다 활용

Jun·2025년 5월 12일

고급 자바

목록 보기
4/7

1. 람다식을 활용하는 법

필터와 맵, 스트림으로 람다식을 활용할 수 있다.

2. 필터(Filter)

필터는 특정 조건을 만족하는 데이터만 선별하는 작업이다.

예시

  • 짝수 필터링
List<Integer> evenNumbers = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());
  • 제네릭 활용 필터링
public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
    List<T> result = new ArrayList<>();
    for (T item : list) {
        if (predicate.test(item)) {
            result.add(item);
        }
    }
    return result;
}

3. 맵(Map)

맵은 데이터를 다른 형태로 변환하는 작업이다.

예시

  • 문자열을 정수로 변환
List<Integer> numbers = strings.stream()
    .map(Integer::valueOf)
    .collect(Collectors.toList());
  • 제네릭 활용 맵핑
public static <T, R> List<R> map(List<T> list, Function<T, R> mapper) {
    List<R> result = new ArrayList<>();
    for (T item : list) {
        result.add(mapper.apply(item));
    }
    return result;
}

4. 스트림(Stream)

스트림은 데이터 처리 작업을 하나의 흐름으로 연결한 것이다.

특징

  • 메서드 체인을 통해 필터와 맵을 연속적으로 사용 가능
  • 내부 반복 처리 지원(선언적 프로그래밍 스타일)

스트림의 사용 예시

List<String> names = students.stream()
    .filter(s -> s.getScore() >= 80)
    .map(Student::getName)
    .collect(Collectors.toList());

5. 내부 반복 vs 외부 반복

  • 외부 반복: 개발자가 반복문을 직접 작성하여 데이터를 순회하는 방식 (for, while)
  • 내부 반복: 스트림 API가 반복을 처리하고, 개발자는 수행 작업만 정의하는 방식 (forEach)

내부 반복 예시

students.stream()
    .filter(s -> s.getScore() >= 80)
    .map(Student::getName)
    .forEach(name -> System.out.println("name: " + name));

6. 정적 팩토리 메서드

객체 생성 과정을 메서드로 캡슐화하여 가독성을 높이는 방법이다.

예시

MyStream.of(list)

7. 명령형 vs 선언형 프로그래밍

  • 명령형: 어떻게 문제를 해결할지 로직을 상세히 기술
  • 선언형: 무엇을 해야 하는지 기술 (스트림, 필터, 맵을 이용한 람다 활용)

예시 비교

명령형 스타일

List<Integer> result = new ArrayList<>();
for (Integer number : numbers) {
    if (number % 2 == 0) {
        result.add(number * 2);
    }
}

선언형 스타일

List<Integer> result = numbers.stream()
    .filter(n -> n % 2 == 0)
    .map(n -> n * 2)
    .collect(Collectors.toList());

선언형 프로그래밍은 코드를 간결하게 만들고, 가독성과 유지보수성을 향상시킨다.

profile
꾸준하게

0개의 댓글