람다 함수는 비교기의 비교 () 메소드가 될 않는 방법

한드 :

나는 자바 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우리가 구현하는 방법은?

Zabuza :

설명

ComparatorA는 기능 인터페이스 (하나의 방법을 요구한다). 따라서, 당신은 람다 표현식을 사용하여 인스턴스를 생성 할 수 있습니다.

이 같은 확장 정규 클래스 또는 익명 클래스로 생성 인스턴스의 다른 방법과 매우 유사하게 작동합니다.

람다는 기능적 인터페이스가 요구 한 방법을 말한다. 단 하나의 방법이 있기 때문에, 모호하지 않습니다. 람다 이름 다음 입력 인수 및 방법 (그것이 제공하는 구현을 제공 본체 ).


개요

당신이 만들 수있는 다음과 같은 옵션이 경우 인터페이스 또는 추상 클래스를 :

  1. 확장하는 클래스를 만들고 새로운 사용
  2. 익명 클래스를 사용하여

우리는 제공하는 인터페이스 한 가정 한 가지 방법은 (그것이라고 기능 인터페이스 후), 우리는 또한 그것의 인스턴스를 만들려면 다음 두 가지 옵션이 있습니다 :

  1. 람다 표현식을 사용하여
  2. 방법 참조를 사용하여

예를 들어, 우리는 다음과 같은 인터페이스를 사용하여, 곱셈 인스턴스를 만들려면 :

@FunctionalInterface
public interface Operation {
    int op(int a, int b);
}
  1. 확장과 새로운 사용하는 클래스를 만듭니다

    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
    
  2. 익명 클래스를 사용합니다 :

    Operation operation = new Operation() {
        @Override
        public int op(int a, int b) {
            return a * b;
        }
    };
    
    // Usage
    System.out.println(operation.op(5, 2)); // 10
    
  3. 람다 식을 사용합니다 :

    Operation operation = (a, b) -> a * b;
    System.out.println(operation.op(5, 2)); // 10
    
  4. 방법 참조를 사용하여

    // 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
    

추천

출처http://43.154.161.224:23101/article/api/json?id=183906&siteId=1