본문 바로가기
스터디

[모던 자바 인 액션] 3장. 람다, 함수형 인터페이스, 메서드 참조

by eunoo 2023. 6. 28.
람다

람다 표현식 : 메서드로 전달할 수있는 익명 함수를 단순화한 것.

 

함수형 인터페이스
  • 오직 하나의 추상 메서드만 가지는 인터페이스
  • 디폴트 메서드가 있더라도 추상 메서드가 오직 하나면 함수형 인터페이스다.
  • 함수형 인터페이스를 사용하서 람다 표현식으로 구현 클래스를 전달할 수 있다.
함수 디스크립터
  • 시그니처는 함수형 인터페이스의 추상 메서드를 말하며 이는 곧 람다 표현식의 시그니처이다.
  • 함수 디스크립터 : 람다 표현식의 시그니처를 서술하는 메서드
  • 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 무엇을 처리할 것인가. -> 함수형 프로그래밍의 패러다임

 

 

댓글