// 객체 생성을 통한 구현
Runnable runnable = new Runnable() {
@Override
public void run(){
// Task
}
}
// 함수형 인터페이스가 선언된 경우 아래와 같이 람다식으로 호출이 가능
Runnable runnable = () -> {
// Task
}
(타입 매개변수 , ...) -> {
// Task; ....;
}
(int a) -> {System.out.println(a);}
// 타입 없이 사용 가능
(a) -> {System.out.println(a);}
// 매개 변수가 하나인 경우 소괄호 생략
a -> {System.out.println(a);}
// 매개 변수가 없는 경우
() -> { //실행문; }
@FunctionalInterface
public interface Interfaze{
public int method(int x);
}
public class clazz {
public static void main(String[] args){
Interfaze fi;
fi = (x) -> {return x * 5};
int i = fi.method(5);
}
}
람다식의 실행 블록에서는 클래스의 멤버(필드 및 메소드)와 로컬 변수를 사용할 수 있다.
여기서, 로컬 변수 사용에는 약간의 주의사항이 따른다. (람다가 익명 객체를 생성하기 때문에, 특성을 똑같이 갖는다.)
public class UsingThis {
public int outterField = 10;
class Inner{
int innerField = 20; //Inner 클래스 멤버변수.
void method(){
//람다식
MyFunctionalInterface fi = () -> {
System.out.println("outterField : "+outterField); //10
System.out.println("outterField : "+UsingThis.this.outterField); //10
System.out.println("innerField : "+innerField); //20
System.out.println("innerField : "+this.innerField); //20
};
fi.method();
}
}
}
람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨다.
익명 구현 객체 특성에 따라, 람다식에서 메소드의 매개변수나 로컬 변수를 사용한다면 이 변수는 수정이 불가한 final 특성을 갖는다.
// 부모 클래스 (익명 객체 예시)
class Animal {
public String bark() {
return "동물이 웁니다";
}
}
public class Main {
public static void main(String[] args) {
// 익명 클래스 : 클래스 정의와 객체화를 동시에. 일회성으로 사용
Animal dog = new Animal() {
@Override
public String bark() {
return "개가 짖습니다";
}
}; // 단 익명 클래스는 끝에 세미콜론을 반드시 붙여 주어야 한다.
// 익명 클래스 객체 사용
dog.bark();
}
}
// 인터페이스 (익명 구현 객체 예시)
public interface TactSwitch {
void onClick();
}
//인터페이스 SwitchEvent의 익명 구현 객체
TactSwitch tactSwitch = new TactSwitch() {
boolean check = false;
@Override
public void onClick() {
if (check) {
check = false;
System.out.println("OFF");
} else {
check = true;
System.out.println("ON");
}
}
};