본문 바로가기

자바/자바8

람다

나중에 한 번 이상 실행할 수 있도록 전달할 수 있는 코드 블록

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