람다
람다 표현식 : 메서드로 전달할 수있는 익명 함수를 단순화한 것.
함수형 인터페이스
- 오직 하나의 추상 메서드만 가지는 인터페이스
- 디폴트 메서드가 있더라도 추상 메서드가 오직 하나면 함수형 인터페이스다.
- 함수형 인터페이스를 사용하서 람다 표현식으로 구현 클래스를 전달할 수 있다.
함수 디스크립터
- 시그니처는 함수형 인터페이스의 추상 메서드를 말하며 이는 곧 람다 표현식의 시그니처이다.
- 함수 디스크립터 : 람다 표현식의 시그니처를 서술하는 메서드
- ex) Predicate<Apple>의 시그니처는 test이고, 함수 디스크립터는 Apple -> boolean 이다.
실행 어라운드 패턴
- 자원 처리할 때 이 패턴을 가진다.
- 자원을 열고, 처리한 다음, 자원을 닫는 패턴. (init -> 작업 -> close)
- 이렇게 설정과 정리 과정으로 감싸있는 형식의 코드를 실행 어라운드 패턴이라고 한다.
- 작업을 처리하는 코드를 람다로 작성하여 동작 파라미터화한다.
// 1. 기존 코드
public String processFile() throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return br.readeLine();
}
}
// 2. 동작 파라미터화하기
@FunctionalInterface
public interface BufferedReaderProcessor {
String process(BufferedReader b) throw IOException;
}
public String processFile(BufferedReaderProcessor p) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return p.process(br);
}
}
//3. 실행하기
String oneLine = processFile((BufferedReader br) -> br.readLine());
String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
메서드 참조
- 기존 메서드를 메서드 참조로 작성하면 가독성이 높아진다.
- 람다 표현식을 메서드 참조로 작성하면 더 간단하게 작성할 수 있다.
List<String> str = Arrays.asList("a","b","A","B");
//람다
str.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
//메서드 참조
str.sort(String::compareToIgnoreCase)
람다 표현식과 메서드 참조 활용하기
1. 기존 코드
public class AppleComparator implements Comparator<Apple> {
@Override
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
}
...
inventory.sort(new AppleComparator);
2. 익명 클래스 사용
inventory.sort(new Comparator<Apple> {
@Override
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
})
3. 람다 표현식 사용
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
//또는
inventory.sort((a1, a2) -> a1.getWeight().compareTo(a2.getWeight()));
//또는
import static java.util.Comparator.comparing;
inventory.sort(comparing(apple -> apple.getWeight()));
4. 메서드 참조 사용
inventory.sort(comparing(Apple::getWeight));
람다를 사용하는 이유
폭포수 : 명령형
함수형 : 무엇을 설계하는지 집중, 무엇을 할 것인지, 메서드 집중
어떻게 할 것인가x 무엇을 처리할 것인가. -> 함수형 프로그래밍의 패러다임
'스터디' 카테고리의 다른 글
[객체지향의 사실과 오해] 5장. 책임과 메시지 (0) | 2023.06.30 |
---|---|
[모던 자바 인 액션] 4장. Stream (0) | 2023.06.30 |
[객체지향의 사실과 오해] 4. 역할, 책임, 협력 (0) | 2023.06.24 |
[모던 자바 인 액션] 1,2장. Java 8의 변화, 동작 파라미터화 (0) | 2023.06.23 |
[객체지향의 사실과 오해] 3. 타입과 추상화 (0) | 2023.06.16 |
댓글