m.forEach(x->System.out.println(x));
//기본형
(int a, int b) -> { return a > b ? a : b; }
//블록 생략
//return 생략
//식이므로 ;도 생략
(int a, int b) -> a > b ? a : b
//타입 추론이 가능한 경우 타입 생략
(a, b) -> a > b ? a : b
//타입이 없고 매개 변수가 하나일 경우 괄호도 생략 가능
a -> a * a
//single statement의 경우 블록 생략 가능
//return이 포함되어 있으면 중괄호 생략 불가능
(int i) -> System.out.println(i)
@FunctionalInterface
어노테이션 사용@FunctionalInterface
interface MyFunc {
void foo();
}
void bar(MyFunc f) {
f.foo();
}
bar(() -> System.out.println("Hello"));
interface MyFunc
와 같은 코드를 만들지 않기 위해서 자주 사용하는 함수형 인터페이스를 미리 정의해 놨다.
Runnable을 제외하고 java.util.function 패키지 안에 있다.
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
인터페이스 | 메소드 | 매개변수 | 리턴 값 |
---|---|---|---|
Runnable | void run() | 0 | void |
Supplier | T get() | 0 | T |
Consumer | void accept(T t) | 1 | void |
Function<T, R> | R apply(T t) | 1 | R |
Predicate | boolean test(T t) | 1 | boolean |
BiFunction<T, U, R> | R apply(T t, U u) | 2 | R |
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
class MyList {
private List<Integer> numbers = Arrays.asList(1, 2, 3);
public void forEach(Supplier<Integer> s) {
for (int x : numbers) {
System.out.println(s.get());
}
}
public static void main(String[] args) {
MyList m = new MyList();
m.forEach(()-> 5);
}
}
Java 1.8부터 컬렉션 프레임워크에도 함수형 인터페이스를 사용하는 메소드들이 추가되었다.
유용하게 사용되니 배워보자.
<출처: 자바의 정석 기초편 564p>
int sum = widgets.stream()
.filter(w -> w.getColor() == RED) //중간연산
.mapToInt(w -> w.getWeight()) //중간연산
.sum(); //최종연산
int i = 5;
Supplier<String> x = () -> {
i = i * i; //error
return "hello " + i;
};
(x) -> System.out.println(x)
System.out::println
() -> { return new Player() }
() -> Player:: new