람다 표현식은 더 많은 기능적 프로그래밍 기능을 수용하기 위한 언어 발전의 일부로 Java 8에 도입되었다. 역사적으로 Java는 주로 객체 지향 프로그래밍 언어였으며 동작이나 작업을 인수로 전달하는 것과 같은 특정 작업은 매우 복잡했다. 람다 표현식의 도입으로 다음과 같은 몇 가지 문제가 해결됐다.
코드 단순화: 람다 식 이전에는 유사한 기능을 하려면 익명 클래스
가 필요했다. 람다 표현식을 사용하면 더 간결하고 읽기 쉬운 코드 작성이 가능해진다.
향상된 컬렉션 처리: 특히 컬렉션 작업에 혁신을 가져왔다. 필터링, 매핑 또는 컬렉션 축소와 같은 작업이 더욱 간소화되었다.
병렬 처리: Java 8의 람다와 함께 Streams API가 도입되면서 병렬화할 수 있는 코드를 작성하는 것이 더 쉬워졌으며 특히 멀티 코어 환경에서 성능이 향상되었다.
람다 표현식과 익명 클래스는 공통 목적을 가지고 있다. 이를 통해 전체 클래스를 생성하지 않고도 기능 인터페이스의 구현을 인라인으로 정의할 수 있다. 그러나 다음과 같은 주요 차이점이 있다.
간결성: 람다 표현식은 익명 클래스보다 훨씬 간결하다.
사용법: 익명 클래스는 여러 추상 메서드가 있는 인터페이스를 구현할 수 있지만 람다 식은 기능적 인터페이스(단일 추상 메서드가 있는 인터페이스)에만 사용된다.
범위: 람다 표현식은 바깥쪽 블록과 동일한 범위를 갖는 반면, 익명 클래스는 자체 범위를 갖는다.
this 키워드: 람다 식에서 this는 바깥쪽 클래스를 참조하는 반면, 익명 클래스에서 this는 익명 클래스 자체를 참조한다.
짧고 기능적인 인터페이스 구현에는 람다 표현식을 사용
더 복잡한 구현을 원하거나 여러 메서드가 포함된 인터페이스를 구현해야 하는 경우 익명 클래스를 사용
Java의 람다 표현식은 다음 구문을 사용하여 작성된다.
(parameters) -> { body }
매개변수: 메소드와 마찬가지로 0개, 1개 또는 여러 개의 매개변수를 사용할 수 있다.
화살표 토큰(->): 매개변수를 본문과 분리한다.
본문: 실행할 표현식이나 문을 포함한다.
List<String> names = Arrays.asList("Alice", "Bobo", "Charlie");
names.forEach(name -> System.out.println(name));
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
numbers.sort((n1, n2) -> n1.compareTo(n2));
Runnable runnable = () -> System.out.println("쓰레드가 실행 중입니다.");
new Thread(runnable).start();
List<String> words = Arrays.asList("Java", "Lambda", "Stream", "API");
words.stream()
.filter(word -> word.startsWith("L"))
.forEach(System.out::println);
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.map(number -> number * number) // 각 숫자를 제곱
.forEach(System.out::println); // 출력
Optional<String> optionalString = Optional.of("Java");
optionalString.ifPresent(str -> System.out.println("Value: " + str));
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]의 세번째 과제