
람다식과 함수형 인터페이스
람다식 : 익명 함수 라고도 불린다. 자바에서는 인터페이스의 익명 클래스를 간략히 표현하는데 사용된다.
함수형 인터 페이스
- 람다식 형태로 익명 클래스가 만들어질 수 있는 인터페이스
- 조건 : 추상 메서드가 하나만 있어야 한다.
- 람다식과 1:1 대응이 될 수 있어야 하므로
- @FunctionalInterface 로 강제
- 조건 : 추상 메서드가 하나만 있어야 한다.
반환값도 없고 파라미터도 없을 때
@FunctionalInterface
public interface Printer {
void print();
// void say (); // 둘 이상의 메서드는 불가하다
}
Printer printer1 = new Printer() {
@Override
public void print() {
System.out.println("람다식이 없었을 때 방식") //익명 클래스 방식
}
};
Printer printer2 = () -> {
System.out.println("인자도 반환값도 없는 람다식");
}
Printer printer3 = () -> System.out.println("반환 값이 없을 때는 {} 생략 가능하다.");
Printer printer4 = () -> {
System.out.println("코드가 여러줄 일 때는");
System.out.println("{}가 필요하다");
};
반환값이 있을 때
@FunctionalInterface
public interface Returner {
Object returnObj ();
}
Retuner returner1 = () -> {return 1;};
Retuner returner2 = () -> 1; // 반환 코드만 있을 시 {}와 return 생략이 가능하다
Object returned1 = returner1.returnObj();
Object returned2 = returner2.returnObj();
반환값도 있고 파라미터가 1개일 때
@FunctionalInterface
public interface SingleParam {
int func (int i);
}
SingleParam square = (i) -> i * i;
SingleParam cube = i -> i * i * i;
int squared = square.func(3); // 9
int cubed = cube.func(3)l //27
반환값도 있고 파라미터가 2개 일 때
@FunctionalInterface
public interface DoubleParam {
int func(int a, int b);
}
DoubleParam add = (a,b) -> a + b;
DoubleParam multyAndPrint = (a,b) -> {
int result = a * b;
return result;
};
Double added = add.func(3,5); // 8
Double multyAndPrinted = multyAndPrint.func(3,5); // 15
근데 이와 같이 우리가 인터페이스를 굳이 계속 만들어줘야하나..? 라는 생각이 들것이다.
그래서 자바에서는 자주 사용하는 인터페이스를 util로 제공한다.
| 함수형 인터페이스 | 메서드 | 인자(들) 타입 | 반환 값 타입 |
| Runnable | run | ||
| Supplier<T> | get | T | |
| Consumer<T> | accept | T | |
| BiConsumer<T ,U> | accept | T, U | |
| Function<T, R> | apply | T | R |
| BiFunction<T, U, R> | apply | T, U | R |
| Predicate<T> | test | T | Boolean |
| BiPredicate<T, U> | test | T, U | Boolean |
| UnaryOperator<T> | apply | T | T |
| BinaryOperator<T> | apply | T,T | T |
'Back-End > JAVA' 카테고리의 다른 글
| 문자열(String)의 메서드 (0) | 2024.11.28 |
|---|---|
| Math, Random 클래스 (2) | 2024.11.19 |
| 래퍼 클래스 (0) | 2024.11.19 |
| 불변 String 클래스와 가변 StringBuilder (1) | 2024.11.19 |
| 람다와 스트림 (1) | 2024.11.19 |