728x90
1. 함수형 인터페이스
- 추상메서드를 하나만 가지고 있는 인터페이스
- @FunctionalInterface 어노테이션을 인터페이스에 선언하면 컴파일 시점에서 추상메서드가 하나만 있는지 체크
- 부작용을 최대한 배제하는, 함수형 프로그래밍의 일환
2. 람다 표현식
메서드를 하나의 식으로 표현 : 메서드 이름과 리턴값의 표시가 없어지기 때문에 익명 함수라고도 한다.
익명 클래스의 객체와 동등하다
interface Calculator {
int sum(int a, int b);
}
class MyCalculator implements Calculator {
public int sum(int a, int b) {
return a+b;
}
}
public class Sample {
public static void main(String[] args) {
MyCalculator mc = new MyCalculator();
int result = mc.sum(3, 4);
System.out.println(result); // 7 출력
}
}
람다로 표현
interface Calculator {
int sum(int a, int b);
}
public class Sample {
public static void main(String[] args) {
Calculator mc = (int a, int b) -> a +b; // 매개변수 -> 리턴(수행코드 블럭)
// 인터페이스를 구현하는 클래스 없이도 인터페이스의 객체를 만들어 그 속성을 사용할 수 있다
int result = mc.sum(3, 4);
System.out.println(result);
}
}
**람다함수로 사용하는 인터페이스는 추상메서드를 하나만 가지고 있어야 한다!
(두 개 이상 시 -> 컴파일 에러 발생)
+ 이펙티브 자바 : 람다식에서, 타입을 명시해야 코드가 더 명확할 때를 제외하고, 람다의 모든 매개변수 타입은 생략하자
+ 점프 투 자바 : 인터페이스에 이미 입출력에 대한 타입이 정의되어 있기 때문에, 입력값의 타입은 생략 가능(생략 하자)
* 더욱 축약 => 클래스 :: 메서드 ex) Integer::sum == Integer.sum(int a, int b) == (a, b) -> a+ b;
+ Bifunction 인터페이스 : Bifunction<T, U, R> ~ 매개변수 2, 리턴 1. 호출 시 apply 메서드를 호출해야 한다.
+ BinaryOperator : Bifunction의 세 타입이 모두 동일한 경우 사용 가능
import java.util.function.BiFunction;
public class Sample {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> mc = (a, b) -> a + b;
int result = mc.apply(3, 4); // sum이 아닌 apply 메서드를 사용해야 한다.
System.out.println(result); // 7 출력
}
}
public class Sample {
public static void main(String[] args) {
BinaryOperator<Integer> mc = (a, b) -> a + b; // 타입이 모두 같은 경우
int result = mc.apply(3, 4);
System.out.println(result); // 7 출력
}
}
728x90
'자바☕' 카테고리의 다른 글
자바 옵셔널(Optional<T>) (0) | 2022.12.11 |
---|---|
스트림 API (0) | 2022.12.11 |
Lombok (0) | 2022.12.06 |
자바 표준 Annotation (0) | 2022.12.06 |
Dynamic Dispatch : 다형성의 일부 (0) | 2022.12.02 |