람다식을 사용하는 이유?
자질구레한 코드 사용 없이 간결하게 코드를 구현할 수 있기 때문.
람다 이전의 코드
Comparator<Apple> appleComparator = new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
return o1.getWeight() - o2.getWeight();
}
};
람다식 적용
Comparator<Apple> appleComparator = (Apple o1, Apple o2) -> o1.getWeight() - o2.getWeight();
람다의 구조
- 파라미터 리스트 : Comparator의 compare 메서드의 파라미터 (두 개의 사과)
- 화살표 : 화살표는 람다의 파라미터 리스트와 바디를 구분
- 람다의 바디 : 두 사과의 무개를 비교. return 값에 해당
함수형 인터페이스 : 정확히 하나의 인터페이스를 지정하는 메서드
함수형 인터페이스로 무엇을 할 수 있나?
- 람다 표현식으로 추상 메서드 구현을 직접 전달 가능 -> 전체 표현식을 함수형 인터페이스의 인스턴스로 취급
익명 클래스를 람다화
Runnable runnable = () -> System.out.println("runnalble");
함수형 인터페이스를 파라미터로 받는 메서드를 만들어서 람다식을 사용
public static void process(Runnable runnable) {
runnable.run() ;
}
process(() ->{
System.out.println("choi");
});
https://jwdeveloper.tistory.com/116?category=833327
함수 디스크립터
일종의 설계도를 의미.
함수형 인터페이스의 람다 표현식의 시그니처를 서술하는 메서드를 의미
ApplePredicate에는 test라는 미구현 메서드가 있고 이는 파라미터로 Apple을 받음을 정의 return type은 boolean
public interface ApplePredicate {
boolean test(Apple apple);
}
전략과 비교 대상을 파라미터로 전송
public static boolean appleProcess(ApplePredicate applePredicate, Apple apple) {
System.out.println(apple.getWeitght());
return applePredicate.test(apple);
}
실행
Boolean result = appleProcess(((Apple apple2) -> apple2.getWeitght() >30), apple);
System.out.println("result:: "+result);
실행 어라운드 패턴
준비 , 정리 가 실행할 작업을 감싸는 형태
동작 파라미터화 와 실행어 라운드 패턴 적용
public static String processFile() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
return br.readLine();
}
위의 코드는 현재 한 개의 행밖에 읽어올 수 없다.
동작 파라미터화
한 번에 여러 줄 or 자주 사용되는 단어를 반환하려면? -> processFile을 메서드로 동작을 전달
동작을 파라미터로 받는 메서드 생성
public static String processFile(BufferedReaderProcessor p) throws IOException {
//초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//실행
return p.processFile(br);
}
동작을 전송하여 해당 메서드 실행
String processFile = processFile((BufferedReader br) -> br.readLine() + br.readLine());
실행하는 부분에 대한 전략을 파라미터로 받으면서 실행 어라운드 패턴으로 동작할 수 있게 되었다.
Code Link
https://github.com/mike6321/PURE_JAVA/tree/master/Java8/2Week/lamda
References
|
'Java > Java8' 카테고리의 다른 글
(JAVA8) 스트림의 활용 (2) (0) | 2020.01.19 |
---|---|
(JAVA8) 람다식 (2) (0) | 2020.01.19 |
(JAVA8) 람다식으로 향하는 과정 (0) | 2020.01.16 |
(JAVA8) 스트림의 개요 (1) (0) | 2020.01.03 |
(JAVA8) Java8 개요 (0) | 2019.11.11 |