함수형 인터페이스
- 오직 하나의 메서드만 가지고 있는 인터페이스
- 상속받은 메서드까지 포함했을 때 하나의 메서드만 가지고 있어야지만 함수형 인터페이스
- 예시)
public interface Predicated<T> {
bollean test(T t);
}
public interface Comparator<T> {
int compare(T o1, T o2);
}
public interface Runnable {
void run();
}
함수형 인터페이스 활용
→ 람다 표현식을 사용하면 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있다.
→ 전체 표현식을 함수형 인터페이스의 인스턴스로 취급
예시)
Runnable r1 = () -> System.out.println("hello 1");
Runnable r2 = new Runnable() [
public void run() {
System.out.println("Hello");
}
}
→ r2 방법을 r1으로 대체할 수 있다.
✔️ 함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식의 시그니처를 가리킨다.
→ 함수 디스크립터: 람다 표현식의 시그니처를 서술하는 메서드
예시)
Runnable 인터페이스는 인수와 반환값이 없는 시그니처
✔️ 유효한 람다 표현식
public Callable<String> fetch() {
return () -> "hello";
}
→ fetch 메서드의 반환형은 Callable<String>
→ Callable 추상 메서드의 제네릭 T에 String을 넣는다면 메서드의 시그니처는 () → String
→ 따라서 "hello"는 String이므로 유요한 람다 표현식
✔️@FunctionalInterface란?
함수형 인터페이스를 가리키는 어노테이션 → 어노테이션을 달고 함수형 인터페이스가 아닌 경우 컴파일 에러
실행 어라운드 패턴
자원 처리에 사용하는 순환 패턴: 자원 오픈 → 처리 → 자원 클로즈
, 즉 실제 자원을 처리하는 코드를 설정과 정리 과정이 둘러싸는 형태
초기화/ 준비 코드
작업 A, B, C ...
정리/마무리 코드
실행 어라운드 패턴을 적용하는 예시
기존 코드)
public String processFile() throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return br.readLine();
}
}
1단계)
public interface BufferedReaderProcessor {
String process(bufferedReader b) throws IOException;
}
2단계)
public String processFile(BufferedReaderProcessor p) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return p.process(br);
}
}
완성)
String oneLine = processFile((BufferedReader br) -> br.readLine());
String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
stream의 중간연산에서는 함수형 인터페이스의 메서드 실행없이 그냥 구현체만 넣어두어도 실행이 가능하다.
Reference
book.naver.com/bookdb/book_detail.nhn?bid=15261103
'Java' 카테고리의 다른 글
Mockito (0) | 2020.11.16 |
---|---|
Junit5 (0) | 2020.11.16 |
함수형 인터페이스 모음 (0) | 2020.10.08 |
댓글