1. 개요
- 목적:
간결한 함수형 인터페이스 구현
- 특징:
익명 함수, 코드 간결화, 함수형 프로그래밍 지원
2. 람다 기본 문법
(매개변수) -> { 실행 코드 }
- 매개변수:람다에 전달되는 값
>
:매개변수와 실행 코드 구분
- 실행 코드:람다에서 실행할 코드
3. 예시 코드
1. MySupplier.java
// 입력 없이 값을 반환(return)
@FunctionalInterface // 람다인터페이스로 사용할 때 붙이는 어노테이션
public interface MySupplier<T> {
T get();
}
2. MyComsumer.java
// 입력만 받고 출력이 없는 연산을 수행
public interface MyConsumer<T> {
void accept(T data);
}
3. MyFunction.java
// 입력을 받아서 결과를 반환
// T는 파라미터의 타입, R은 리턴 타입
public interface MyFunction<T,R> {
R apply(T t);
}
4. MyPredicate.java
// 입력을 받아서 논리값(boolean)을 리턴
public interface MyPredicate<T> {
boolean apply(T t);
}
5. 람다 연습 App.java
// 1. 람다는 인터페이스로 만든다
// 2. 인터페이스에는 메서드가 하나만 존재해야 한다.
// 3. 메서드가 인터페이스를 매개변수(파라미터)로 받고 있으면, 행위를 주세요!
// 4. 람다에서는 매개변수에 타입이 생략 가능하다.
// 5. @FunctionalInterface로 람다 인터페이스 표시 가능
// 람다식과 람다표현식의 차이점 >> 람다표현식은 return을 하지만 람다식은 안함 >> return의 유무
public class App {
public static void main(String[] args) {
// 람다식
MyConsumer<Integer> r1 = (data) -> {
System.out.println("소비할 데이터 r1: " + data);
};
r1.accept(1);
// 람다표현식
MySupplier<String> r2 =() -> {return "good";};
MySupplier<String> r3 =() -> "good"; // return은 생략가능
String msg = r3.get();
System.out.println("r3: " + msg);
MyFunction<Integer, Double> r4 = (x) -> {
return x / 1.5;
};
System.out.println("r2: " + r4.apply(3));
MyPredicate<Integer> r5 = integer -> integer % 2 == 0;
System.out.println("r5: " + r5.apply(1));
}
}
6. 출력물
소비할 데이터 r1: 1
r3: good
r2: 2.0
r5: false
4. 람다 사용 예시
1.리스트 필터링
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(item -> System.out.println(item));
- 리스트의 각 요소 출력
2. 컬렉션 정렬
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5);
numbers.sort((a, b) -> a - b);
- 정렬 기준으로 람다 사용
5. 함수형 인터페이스
- 정의:하나의 추상 메소드만 가진 인터페이스
- 예시:
Runnable
,Callable
,Comparator
6. 주요 람다 사용 예
forEach()
컬렉션의 각 요소에 대해 람다 실행
list.forEach(item -> System.out.println(item));
map()
컬렉션의 각 요소 변환
list.stream().map(item -> item.toUpperCase()).forEach(System.out::println);
filter()
조건에 맞는 요소 필터링
list.stream().filter(item -> item.startsWith("a")).forEach(System.out::println);
7. 람다 장점
- 간결한 코드
- 가독성 향상
- 함수형 프로그래밍 지원
- 변경 불가능한 코드 (불변성)
8. 람다 단점
- 디버깅 어려움
- 과도한 사용 시 코드 가독성 저하
- 상태 변화가 필요한 로직에 적합하지 않음
9. 람다와 익명 클래스 비교
항목 | 람다 표현식 | 익명 클래스 |
코드 길이 | 짧고 간결 | 상대적으로 길고 복잡함 |
가독성 | 좋음 | 복잡하고 읽기 어려움 |
상태 변경 | 불변성 유지 가능 | 상태를 변경할 수 있음 |
성능 | 더 나은 성능 | 비슷하지만 더 많은 객체 생성 |
Share article