람다 표현식(Lambda Expressions)이란?
Java 8에서 도입된 함수형 프로그래밍의 핵심 기능으로 람다 표현식은 익명 함수(Anonymous Functions)를 간결하게 표현하는 방법이다. 함수를 변수에 할당하거나 다른 함수에 전달하는 등의 작업을 수행할 수 있다.
1. 람다 표현식 구문
(parameter) -> { expression }
- parameter : 매개변수를 정의하고, 매개변수를 받지 않는 경우 빈 괄호 '()'를 사용
- expression : 실행할 함수를 정의한다. 식(expression)이 하나인 경우 중 괄호 '{}'를 생략할 수 있다.
1-1) 익명함수와 람다 표현식 비교
// 익명 함수
Function<Integer, Integer> anonymousFunction = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer number) {
return number * 2;
}
};
// 람다 표현식
Function<Integer, Integer> lambdaExpression = number -> number * 2;
// 익명 함수 사용
int result1 = anonymousFunction.apply(5); // 결과: 10
// 람다 표현식 사용
int result2 = lambdaExpression.apply(5); // 결과: 10
2. 람다 표현식 사용 예
2-1) 매개 변수가 없는 람다 표현식
Runnable runnable = () -> {
System.out.println("Hello, World!");
};
2-2) 매개 변수가 있는 람다 표현식
Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
2-3) 메서드 참조를 사용한 람다 표현식
Function<String, Integer> converter = Integer::parseInt;
2-4) 조건문과 반환문을 사용한 람다 표현식
Predicate<Integer> isEven = n -> {
if (n % 2 == 0) {
return true;
} else {
return false;
}
};
3. 주로 사용되는 상황
3-1) 고차함수
public class HigherOrderFunctionsExample {
public static void main(String[] args) {
// 고차 함수인 filter를 사용하여 리스트에서 짝수만 필터링하는 예시
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = filter(numbers, n -> n % 2 == 0);
System.out.println(evenNumbers); // 출력: [2, 4, 6, 8, 10]
}
// 고차함수 filter 구현
public static List<Integer> filter(List<Integer> list, Predicate<Integer> predicate) {
List<Integer> result = new ArrayList<>();
for (Integer element : list) {
if (predicate.test(element)) {
result.add(element);
}
}
return result;
}
}
- filter 함수를 사용하여 리스트에서 조건에 맞는 요소를 필터링하는 기능을 구현
3-2) 동적 파라미터
동일한 코드를 여러 동작에 대해 다르게 수행할 수 있도록 하는 방법
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class BehaviorParameterizationExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 짝수를 필터링하는 동작
List<Integer> evenNumbers = filter(numbers, n -> n % 2 == 0);
System.out.println("Even numbers: " + evenNumbers); // 출력: [2, 4, 6, 8, 10]
// 홀수를 필터링하는 동작
List<Integer> oddNumbers = filter(numbers, n -> n % 2 != 0);
System.out.println("Odd numbers: " + oddNumbers); // 출력: [1, 3, 5, 7, 9]
}
public static List<Integer> filter(List<Integer> list, Predicate<Integer> predicate) {
List<Integer> result = new ArrayList<>();
for (Integer element : list) {
if (predicate.test(element)) {
result.add(element);
}
}
return result;
}
}
3-3) 함수형 인터페이스
한수형 인터페이스는 단 하나의 추상 메서드를 가진 인터페이스이다.
// 함수형 인터페이스 정의
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
public class FunctionalInterfaceExample {
public static void main(String[] args) {
Calculator addition = (a, b) -> a + b;
int sum = addition.calculate(5, 3);
System.out.println(sum); // 출력: 8
Calculator subtraction = (a, b) -> a - b;
int difference = subtraction.calculate(7, 2);
System.out.println(difference); // 출력: 5
}
}
- Calculator 인터페이스를 정의하고, 익명 함수를 사용하여 덧셈과 뺄셈을 수행하는 기능을 구현
// Runnable은 run 메서드만 가지고있는 함수형 인터페이스이다.
Runnable runnable = () -> System.out.println("Runnable");
runnable.run(); // 출력 : Runnable
3-4) 스트림 처리
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 스트림을 사용하여 짝수를 필터링하고 합산하는 예시
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println(sum); // 출력: 6
}
}
- Callback 인터페이스를 정의하고, 익명 함수를 사용하여 콜백을 실행하는 기능을 구현
반응형
'Java' 카테고리의 다른 글
[Java] 메서드 참조 사용 방법 (1) | 2023.05.24 |
---|---|
[Java] 스트림(Stream) API 사용 방법 (0) | 2023.05.23 |
[Spring Boot] Spring Batch + scheduler 사용해 일정 주기로 실행 방법 (0) | 2023.03.24 |
[Spring Boot / Java8] OpenAI API GPT3 사용 방법 (0) | 2023.03.23 |
[Spring Boot] Security @AuthenticationPricipal 객체로 로그인 정보 받는 방법 (0) | 2023.03.21 |