나중에 한 번 이상 실행할 수 있도록 전달할 수 있는 코드 블록
Integer.compare(first.length(), second.length());
파라미터가 있는 표현식
(String first, String second) -> Integet.compare(first.length(), second.length());
파라미터의 타입을 추정할 수 있는 경우는 타입을 생략
(first, second) -> Integet.compare(first.length(), second.length());
파라미터를 받지 않으면 빈 괄호를 사용
() -> { for (int i = 0; i < 1000; i++) doWork(); };
리턴 타입은 지정하지 않고 문맥으로 추정
(first, second) -> Integet.compare(first.length(), second.length()); // 리턴 타입은 int
람다 표현식을 객체가 아니라 함수로 생각하고, 함수형 인터페이스에 전달할 수 있다고 인식하자
Arrays.sort(words, (first, second) -> Integer.compare(first.length(), second.length()));
람다 표현식의 몸체에서 checked Excetion을 던질 수 있는 경우, 해당 Exception이 대상 인터페이스의 추상 메소드에 선언되어 있어야 함
Runnable sleeper = () -> { Thread.sleep(1000); };
// 오류 : Thread.sleep은 InterruptedException을 던질 수 있지만 Runnable.run 은 던질 수 없음
메소드 레퍼런스
Array.sort(words, (x, y) -> x.compareToIgnoreCase(y));
Array.sort(words, String:compareToIIgnoreCase);
생성자 레퍼런스
Button[] buttons = stream.toArray(Button[]::new);
변수 유효 범위
- 코드 블록
- 파라미터
- 자유 변수(람다 표현식이 자유 변수를 캡쳐했다고 표현함)
public static coid repeatMessage(String text, int count) { // 자유 변수 text, count
Runnable r = () {
while (count > 0) {
count--; // 오류 : 캡쳐한 변수는 변경할 수 없음
System.out.println(text);
Thread.yield();
}
};
new Thread(r).start();
}
인터페이스 메소드(디폴트 메소드)
list.forEach( ... );
인터페이스의 정적 메소드
(first, second) -> Comparator.comparing(String::length);
지연 실행
- 람다의 핵심은 지연 실행
'자바 > 자바8' 카테고리의 다른 글
Stream API (0) | 2016.09.21 |
---|