나는 자바 8에, 하나는 이런 비교를 정의 할 수 있음을 보았다 :
Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());
이는 동일하다 :
Comparator d = new Comparator<Computer> () {
@Override
public int compare(Computer c1, Computer c2){
return c1.getAge().compareTo(c2.getAge());
}
};
나는이 작동 방식을 이해하고 싶습니다. 두 번째 예는 매우 간단하십시오의 Comparator
목적은 방법으로 생성 compare
사용하여 비교 수행 compareTo
의 방법 age
의 속성 Computer
. 우리가 수행 할 때이 방법은 단순히 우리가 호출됩니다
Computer comp1 = new Computer(10);
Computer comp2 = new Computer(11);
d.compare(comp1, comp2); // -1
첫 번째 예에서 무슨 일이 일어나고 있는지하지만, 람다를 사용하는 경우? 우리가이 설정하는 것 나에게 보이는 Comparator
방법이 수행 비교 동일하게. 때문에 그러나이 될 수없는 Comparator
객체가 방법을 가진 개체입니다 compare
. 나는 람다는 (하나의 방법 인터페이스) 기능 인터페이스로 사용될 수 있다는 것을 배웠다. 그러나 Comparator
기능적인 인터페이스 (그 이외의 다른 많은 방법이 아니다 compare
!). 어떻게 그것이라는 자바 인터프리터 알고 있나요 compare
우리가 구현하는 방법은?
설명
Comparator
A는 기능 인터페이스 (하나의 방법을 요구한다). 따라서, 당신은 람다 표현식을 사용하여 인스턴스를 생성 할 수 있습니다.
이 같은 확장 정규 클래스 또는 익명 클래스로 생성 인스턴스의 다른 방법과 매우 유사하게 작동합니다.
람다는 기능적 인터페이스가 요구 한 방법을 말한다. 단 하나의 방법이 있기 때문에, 모호하지 않습니다. 람다 이름 다음 입력 인수 및 방법 (그것이 제공하는 구현을 제공 본체 ).
개요
당신이 만들 수있는 다음과 같은 옵션이 경우 인터페이스 또는 추상 클래스를 :
- 확장하는 클래스를 만들고 새로운 사용
- 익명 클래스를 사용하여
우리는 제공하는 인터페이스 한 가정 한 가지 방법은 (그것이라고 기능 인터페이스 후), 우리는 또한 그것의 인스턴스를 만들려면 다음 두 가지 옵션이 있습니다 :
- 람다 표현식을 사용하여
- 방법 참조를 사용하여
예를 들어, 우리는 다음과 같은 인터페이스를 사용하여, 곱셈 인스턴스를 만들려면 :
@FunctionalInterface
public interface Operation {
int op(int a, int b);
}
확장과 새로운 사용하는 클래스를 만듭니다
public class Multiplicator implements Operation { @Override public int op(int a, int b) { return a * b; } } // Usage Operation operation = new Multiplicator(); System.out.println(operation.op(5, 2)); // 10
익명 클래스를 사용합니다 :
Operation operation = new Operation() { @Override public int op(int a, int b) { return a * b; } }; // Usage System.out.println(operation.op(5, 2)); // 10
람다 식을 사용합니다 :
Operation operation = (a, b) -> a * b; System.out.println(operation.op(5, 2)); // 10
방법 참조를 사용하여
// Somewhere else in our project, in the `MathUtil` class public static int multiply(int a, int b) { return a * b; } // Usage Operation operation = MathUtil::multiply; System.out.println(operation.op(5, 2)); // 10