람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체
Runable runable = () -> { ... }
(타입 매개변수, ...) -> { 실행문; ... }
(int a) -> { System.out.println(a); }
인터페이스 변수 = 람다식;
Method()가 매개 변수를 가지지 않는 경우
@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
}
MyFunctionalInterface fi = () -> { ... }
fi.method();
@FunctionalInterface
public interface MyFunctionalInterface {
public void method(int x);
}
MyFunctionalInterface fi = (x) -> { ... }
or
MyFunctionalInterface fi = x -> { ... }
fi.method(5);
@FunctionalInterface
public interface MyFunctionalInterface {
public void method(int x, int y);
}
MyFunctionalInterface fi = (x, y) -> { ...; return 값; }
int result = fi.method(2, 5);
MyFunctionalInterface fi = (x, y) -> { return x+ y; }
or
MyFunctionalInterface fi = (x, y) -> return x+ y;
MyFunctionalInterface fi = (x, y) -> { return sum(x, y); }
or
MyFunctionalInterface fi = (x, y) -> sum(x, y);
public class ThisExaple {
public int outterField = 10;
class inner {
int innerField = 20;
void method() {
// 람다식
MyFunctionalInterface fi = 0 -> {
System.out.println("outterFiled"+outterField);
System.out.println("outterFiled"+ThisExaple.this.outterField+"\n");
// 바깥 객체의 참조를 얻기 위해서는 클래스명.this를 사용
System.out.println("innerField"+innerField);
System.out.println("innerField"+this.innerField+"\n");
// 람다식 내부에서 this는 innser 객체를 참조
};
fi.method();
}
public class UsingLocalVariable {
void method(int arg) { //arg는 final 특성을 가짐
int localVar = 40; // localVar는 final 특성을 가짐
// arg = 31; // final 특성 때문에 수정 불가
// localVar = 41; // final 특성 때문에 수정 불가
// 람다식
MyFunctionalInterface fi = () -> {
// 로컬 변수 사용
System.out.println("arg : "+arg);
System.out.println("localVar : "+localVar);
}
fi.method();
}
}
매개값 -> Consumer
Consumer<String> consumer = t -> { t를 소비하는 실행문; };
BiConsumer<String, String> consumer = (t, u) -> { t와 u를 소비하는 실행문; }
DoubleConsumer consumer = d -> { d를 소비하는 실행문; }
ObjIntConsumer<String> consumer = (t, i) -> { t와 i를 소비하는 실행문; }
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.DoubleConsumer;
import java.util.function.ObjIntConsumer;
public class ConsumerExample {
public static void main(String[] args) {
Consumer<String> consumer = t -> System.out.println(t + "8");
consumer.accept("java");
BiConsumer<String, String> biConsumer = (t, u) -> System.out.println(t + u);
biConsumer.accept("java", "8");
DoubleConsumer doubleConsumer = d -> System.out.println("java"+d);
doubleConsumer.accept(8.0);
ObjIntConsumer<String> objIntConsumer = (t, i) -> System.out.println(t + i);
objIntConsumer.accept("java", 8);
}
}
Supplier -> 리턴값
Supplier<String> supplier = () -> { ...; return "문자열" }
IntSupplier supplier = () -> { ...; return int 값; }
import java.util.function.IntSupplier;
public class SupplierExample {
public static void main(String[] args) {
IntSupplier intSupplier = () -> {
int num = (int)(Math.random()*6)+1;
return num;
};
int num = intSupplier.getAsInt();
System.out.println("눈의 수" + num);
}
}
매개값 -> function -> 리턴값
Function<Student, String> Function = t -> { return t.getName(); }