본문 바로가기

Java

Java 람다 표현식

람다 표현식의 기본 문법

람다 표현식의 기본 형식은 다음과 같습니다:

(매개변수) -> { 함수 본문 }
  • 매개변수 목록과 함수 본문 사이에 -> 연산자가 있습니다.
  • 함수 본문이 단일 문장인 경우 중괄호 {}와 return 키워드를 생략할 수 있습니다.
  • 매개변수의 타입은 컴파일러가 문맥을 통해 추론할 수 있으므로 생략할 수 있습니다.

예제

기본 형식의 람다 표현식:

(int a, int b) -> { return a + b; }

 

중괄호와 return 생략:

(int a, int b) -> a + b

 

매개변수 타입 생략:

(a, b) -> a + b

 

함수형 인터페이스

람다 표현식은 하나의 추상 메소드를 갖는 함수형 인터페이스와 함께 사용됩니다. 자바 8에서는 @FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있습니다.

사용자 정의 함수형 인터페이스 예제

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

 

MathOperation 인터페이스를 사용하는 람다 표현식 예제:
 
public class Main {
    public static void main(String[] args) {
        MathOperation addition = (a, b) -> a + b;
        MathOperation subtraction = (a, b) -> a - b;

        System.out.println("Addition: " + addition.operate(5, 3));
        System.out.println("Subtraction: " + subtraction.operate(5, 3));
    }
}

 

출력:

Addition: 8
Subtraction: 2

 

자바의 표준 함수형 인터페이스

자바 8에서는 java.util.function 패키지에 여러 가지 표준 함수형 인터페이스를 제공합니다. 이들은 다양한 용도로 사용할 수 있으며, 대표적인 것들은 다음과 같습니다:

  • Function<T, R>: 하나의 인수를 받아 결과를 반환하는 함수
  • Consumer<T>: 하나의 인수를 받아 소비하는 함수 (반환 값 없음)
  • Supplier<T>: 인수를 받지 않고 값을 반환하는 함수
  • Predicate<T>: 하나의 인수를 받아 boolean 값을 반환하는 함수
  • BiFunction<T, U, R>: 두 개의 인수를 받아 결과를 반환하는 함수

예제

import java.util.function.Function;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.function.Predicate;
import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        Function<Integer, String> intToString = num -> "Number: " + num;
        System.out.println(intToString.apply(5)); // Number: 5

        Consumer<String> print = message -> System.out.println(message);
        print.accept("Hello, World!"); // Hello, World!

        Supplier<Double> random = () -> Math.random();
        System.out.println(random.get()); // Random value (예: 0.123456789)

        Predicate<Integer> isEven = num -> num % 2 == 0;
        System.out.println(isEven.test(4)); // true
        System.out.println(isEven.test(7)); // false

        BiFunction<Integer, Integer, Integer> multiply = (a, b) -> a * b;
        System.out.println(multiply.apply(3, 4)); // 12
    }
}

 

출력:

Number: 5
Hello, World!
<random value> // 예: 0.123456789 (각 실행마다 다름)
true
false
12

컬렉션 처리에서의 람다 표현식

람다 표현식은 컬렉션 처리와 스트림 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", "David");

        // forEach 메소드와 람다 표현식
        names.forEach(name -> System.out.println(name));

        // 스트림 필터와 맵 연산
        names.stream()
            .filter(name -> name.startsWith("A"))
            .map(String::toUpperCase)
            .forEach(System.out::println);
    }
}
 

출력:

 
Alice
Bob
Charlie
David

ALICE
 
 

첫 번째 forEach 메소드 호출은 리스트의 모든 이름을 출력합니다. 두 번째 스트림 연산은 "A"로 시작하는 이름을 필터링하고, 필터링된 이름을 대문자로 변환하여 출력합니다.

정리

람다 표현식은 자바에서 익명 함수를 간결하게 작성할 수 있게 해주는 강력한 기능입니다. 함수형 인터페이스와 함께 사용되며, 자바 8에서 도입된 스트림 API와 결합하면 매우 유용합니다. 자바의 표준 함수형 인터페이스를 사용하여 다양한 상황에서 람다 표현식을 적용할 수 있습니다.

'Java' 카테고리의 다른 글

Spring 인증과 인가  (0) 2024.08.19
알고리즘 코딩테스트( 시간 복잡도 ~ 구간 합 )  (0) 2024.08.16
Java 제네릭  (0) 2024.07.31
Java Stream(스트림)  (0) 2024.07.30
Java 배열  (0) 2024.07.23