람다식은 functional interface가 있어야 될 자리면 모두 사용할 수 있다.
=> 이때 functional interface를 target type이라고 하며, 컴파일시 target type에 맞춰서 람다식이 해석되어진다.
output = (x > y) ? (event) -> system.out.println("yes") : "no"
interface MyFunction{
double apply(double x);
}
double integral(MyFunction f, double a, double b, int n){
int i;
double sum = 0;
double dt = (b - a)/n;
for(i = 0; i < n; ++i){
sum += f.apply(a + (i +0.5)*dt);
}
return sum*dt;
}
r = integral(x -> x*x, 0, 1, 100)
r = integral(x -> x*x*x, 0, 1, 100)
Timer t = new Timer(1000, event -> System.out.println("the time is" + new Date()));
//Timer 생성자의 인자로 람다식이 전달하고 있다.
//그리고 이 람다식을 callback함수로도 해석할 수 있다.
interface IntConsumer{
double accept(int x);
}
void repeat(int n, IntConsumer action){
for(i=0; i<n; i++) action.accept(i);
}
//Annnonymous Inner Class
repeat(10,
new Intconsumer(){
public double accept(int x){
System.out.println("Countdown: "+(10-x));
}
});
//Lambda Expression
repeat(10, x -> System.out.println("Countdown: "+(10-x));
Interger[] values = {2, 9, 5, 0, 3, 7, 1, 4, 8, 6};
...
System.out.println(
Arrays.stream(values)
.filter(value -> value > 4) //Lambda expression을 통해 4보다 큰 것만 필터링하고 있다.
.sorted()
.collect(Collectors.toList())); //결과: [5, 6, 7, 8, 9]