언어/Java

6. Java 고급 문법 (2) 람다식과 Streams

뉴비2 2024. 11. 10. 19:29

Java 람다식과 스트림 API: 현대적인 함수형 프로그래밍 기법

람다식이란 무엇인가?

람다식은 익명 함수를 간결하게 표현하는 방법입니다. 기존의 복잡한 메서드 정의 대신 더 간단하고 직관적인 방식으로 함수를 표현할 수 있게 해줍니다.

람다식의 기본 문법

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

주요 특징:

  • 이름 없는 메서드
  • 코드를 간결하게 만들어줌
  • 함수를 변수처럼 다룰 수 있음

람다식 예제

// 기존 방식
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

// 람다식으로 변환
Runnable lambdaRunnable = () -> System.out.println("Hello World");

스트림 API: 데이터 처리의 혁명

스트림 API는 컬렉션을 효율적으로 처리하기 위한 Java 8의 혁신적인 기능입니다.

스트림의 주요 특징

  1. 내부 반복: 외부 반복 대신 내부에서 반복 처리
  2. 지연 연산: 필요한 시점에만 연산 수행
  3. 병렬 처리 지원: parallelStream()을 통한 쉬운 병렬 처리

스트림 API 기본 사용법

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 스트림을 사용한 데이터 처리
List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("A"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

오픈소스에서의 활용 예제

Apache Commons Lang의 람다 활용

// 컬렉션 변환 예제
List<String> transformedList = ListUtils.transformingList(
    originalList, 
    name -> name.toUpperCase()
);

Spring Framework의 스트림 활용

// 객체 필터링 및 변환
List<User> activeUsers = userRepository.findAll().stream()
    .filter(User::isActive)
    .map(user -> new UserDTO(user))
    .collect(Collectors.toList());

주의사항 및 최적화 방법

람다식 사용 시 주의점

  1. 과도한 사용 자제: 가독성을 해치지 않도록 주의
  2. 복잡한 로직은 피하기: 간단명료하게 작성
  3. 디버깅의 어려움: 익명 함수는 추적이 어려울 수 있음

스트림 API 최적화 팁

  1. 작은 데이터셋에서는 일반 반복문 고려
  2. 병렬 스트림은 신중하게 사용
  3. 중간 연산 최소화
// 비효율적인 예
list.stream()
    .filter(x -> x > 10)
    .map(x -> x * 2)
    .filter(x -> x % 2 == 0)
    .collect(Collectors.toList());

// 최적화된 예
list.stream()
    .filter(x -> x > 10 && x % 2 == 0)
    .map(x -> x * 2)
    .collect(Collectors.toList());

결론

람다식과 스트림 API는 Java 프로그래밍을 더욱 간결하고 표현력 있게 만들어줍니다. 하지만 무분별한 사용보다는 상황에 맞는 현명한 적용이 중요합니다.