람다표현식 - 메서드로 전할할 수 있는 익명 함수를 단순화한 것
람다 특징
익명 : 보통의 메서드와 달리 이름이 없음으로 익명이라 표현
함수 : 특정 클래스에 종속되지 않으므로 함수라고 부름
전달 : 메서드 인수로 전달하거나 변수로 저장가능
간결성 : 익명 클래스처럼 자질구레하게 구현할 필요 없음
Comparator<Apple> byWeghtLamda = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
파라미터 리스트
- 파라미터 (두 개의 사과)
화살표
- 람다의 파라미터 리스트와 바디를 구분
람다의 바디
- 두 사과의 무개를 비교, 반홤값에 해당하는 표현식
자바 8에서 지원하는 람다 5가지 표현
(String s) -> s.length(); // String 형식의 파라미터를 가지며 int를 반환. 람다 표현식에서는 return이 함축되어 return을 명시적으로 안 사용해도 된다
(Apple a) -> a.getWeight() > 150;
(int x, int y) -> { // int 형식 파라미터를 가지며 리턴이 없다
System.out.println("Result:");
System.out.println(x + y);
}
() -> 42;
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
람다 예제와 사용 사례 리스트
불린 표현식 - (List<String> list) -> list.isEmpty();
객체 생성 - () -> new Apple(10)
객체에서 소비 - (Apple a) -> { System.out.println(a.getWeight());
객체에서 선택/추출 (String s) -> s.length()
두 값을 조합 (int a, int b) -> a * b
두 객체 비교 (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
함수형 인터페이스
- 정확히 하나의 추상 메서드를 지정하는 인터페이스
함수 디스크립터
- 시그니처를 서술하는 메서드
@FunctionalInterface는?
- 함수형 인터페이스를 가리키는 어노테이션
- 어노테이션을 선언 했지만 실제로 함수형 인터페이스가 아니면 컴파일 에러 발생
실행 어라운드 패턴 (execute around pattern)
초기화/준비 코드 초기화/준비 코드
작업A 작업B
정리/마무리 코드 정리/마무리 코드
Predicate
- java.util.function.Predicate<T> 인터페이스는 test라는 추상 메서드를 정의하며 test는 제네릭 형식 T의 객체를 인수로 받아 불린을 반환
Consumer
- java.util.function.Consumer<T> 인터페이스는 제네링 형식 T 객체를 받아서 void를 반환하는 accept라는 추상 메서드를 저의
- T형식의 객체를 인수로 받아서 어떤 동작을 수행하고 싶을때 사용
Function
- java.util.function.Function<T, R>인터페이스는 제네릭 형식 T를 인수로 받아서 제네릭 형식 R을 반환하는 apply 라는 추상 메서드를 정의
- 입력을 출력으로 매핑하는 람다를 정의할 때 Function 인터페이스를 활용
'java' 카테고리의 다른 글
Queue는 무엇인가? (0) | 2017.11.15 |
---|---|
배열과 리스트 (0) | 2017.11.15 |
Java HashMap동작 원리 (0) | 2017.10.16 |
ClassLoader (0) | 2017.10.14 |
GabageCollector (0) | 2017.10.14 |