익명 클래스 대신 람다를 사용하도록이 코드를 리팩토링하려고합니다. GUI의 간단한 항목 목록입니다. 각 항목마다 다른 청취자를 등록하고 마지막으로 생성 된 항목은 클릭 할 때 특별한 작업을 수행합니다.익명 클래스를 람다로 변환 한 후에 코드가 달라집니다.
class ItemList {
interface OnClickListener {
void onClick();
}
OnClickListener current;
OnClickListener newListener(final int n) {
return current = new OnClickListener() {
public void onClick() {
if (this == current)
System.out.println("doing something special (item #"+n+")");
System.out.println("selected item #" + n);
}
};
}
public static void main(String[] args) {
ItemList l = new ItemList();
OnClickListener ocl1 = l.newListener(1);
OnClickListener ocl2 = l.newListener(2);
OnClickListener ocl3 = l.newListener(3);
ocl1.onClick();
ocl2.onClick();
ocl3.onClick();
}
}
이 예상대로 작동합니다
$ javac ItemList.java && java ItemList
selected item #1
selected item #2
doing something special (item #3)
selected item #3
지금 내가 대신 익명 클래스의 람다 사용하도록 변경 :
class ItemList {
interface OnClickListener {
void onClick();
}
OnClickListener current;
OnClickListener newListener(final int n) {
return current =() -> {
if (this == current)
System.out.println("doing something special (item #"+n+")");
System.out.println("selected item #" + n);
};
}
public static void main(String[] args) {
ItemList l = new ItemList();
OnClickListener ocl1 = l.newListener(1);
OnClickListener ocl2 = l.newListener(2);
OnClickListener ocl3 = l.newListener(3);
ocl1.onClick();
ocl2.onClick();
ocl3.onClick();
}
}
를하지만 이제 더 이상 마지막에 특별한 일을하지 않습니다 목? 왜? ==
은 람다와 다르게 작동합니까? 처음에는 retrolambda의 버그라고 생각했지만이 예제는 일반 JDK8에서 실행 중이며 여전히 발생합니다. 람다 내부
$ javac A.java && java A
selected item #1
selected item #2
selected item #3
Lambdas는 실제로 본문에서 'this'를 참조 할 수 없습니다. –