람다 표현식의 기본 문법
람다 표현식의 기본 형식은 다음과 같습니다:
(매개변수) -> { 함수 본문 }
- 매개변수 목록과 함수 본문 사이에 -> 연산자가 있습니다.
- 함수 본문이 단일 문장인 경우 중괄호 {}와 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 |