>  기사  >  Java  >  람다 표현식 및 기능 인터페이스에 대한 심층적인 이해

람다 표현식 및 기능 인터페이스에 대한 심층적인 이해

青灯夜游
青灯夜游앞으로
2019-11-25 15:44:022086검색

Java8은 Java 역사상 가장 많이 변경된 버전이라고 합니다. 여기에는 중요한 새로운 기능이 많이 포함되어 있으며 그 핵심은 Lambda 표현식과 Stream API의 추가입니다. 두 개를 함께 사용할 수도 있습니다. [추천 학습: java 동영상 튜토리얼]

람다 표현식 및 기능 인터페이스에 대한 심층적인 이해

먼저 람다 표현식이 무엇인지 살펴보겠습니다.

Lambda 표현식, Wikipedia의 설명은 익명 함수 및 클로저를 나타내는 데 사용되는 연산자입니다. 이 설명을 보면 여전히 매우 추상적인 느낌이 듭니다. 다음으로 예제를 살펴보겠습니다.

public class SwingTest {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {                
                System.out.println("Button Pressed!");
            } 
        }); 
        
        jFrame.add(jButton); jFrame.pack(); 
        jFrame.setVisible(true); 
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    }
}

이것은 Swing 섹션입니다. 프로그래밍에서는 버튼을 클릭하면 "Button Pressed!"라는 메시지가 콘솔에 출력됩니다. 여기서는 익명 내부 클래스의 인스턴스가 생성되어 리스너에 바인딩됩니다. 이는 과거의 보다 일반적인 코드 구성 형식이기도 합니다. 그러나 좀 더 자세히 살펴보면 실제로 우리가 집중하고 있는 것은 ActionEvent 유형 매개변수 e와 콘솔에 출력되는 System.out.println("Button Pressed!"); 명령문이라는 것을 알 수 있습니다.
이전 프로그램에서 익명의 내부 클래스를 이용하여 인터페이스 인스턴스를 생성하는 코드를 람다 표현식으로 대체하면 다음과 같은 코드가 됩니다.
public class SwingTest {

public static void main(String[] args) {
    JFrame jFrame = new JFrame("My JFrame");
    JButton jButton = new JButton("My JButton");

    jButton.addActionListener(e -> System.out.println("Button Pressed!"));

    jFrame.add(jButton);
    jFrame.pack();
    jFrame.setVisible(true);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}
중간 부분의 변화에 ​​주목하세요 원래 6줄의 코드에서 이제는 단 한 줄로 구현할 수 있습니다. 이는 람다 표현식의 간단한 형태입니다.
람다식의 구문은
(param1,param2,param3) -> {

//todo

}
여기서 매개변수의 타입 프로그램은 문맥에 따라 유추할 수 있지만 모든 타입이 그럴 수는 없음을 알 수 있습니다. 추론됨. 매개변수 유형을 명시적으로 선언해야 하는 경우 매개변수가 하나만 있으면 괄호를 생략할 수 있습니다. todo 섹션에 코드 한 줄만 있으면 외부 중괄호를 생략할 수 있습니다. 위의 예처럼

간결한 코드 외에도 Lambda 표현식이 우리에게 어떤 변화를 가져왔나요?

Java에서는 함수를 메서드에 매개 변수로 전달할 수 없고 반환 값이 함수의 메서드라고 선언할 수도 없다는 점을 기억해 봅시다. Java8 이전에는 대답이 '예'였습니다.

따라서 위의 예에서는 익명의 내부 클래스를 매개변수로 사용하는 대신 이벤트가 트리거될 때 이 작업을 수행할 수 있음을 리스너에게 알려주는 실제로 코드 로직을 리스너에 매개변수로 전달할 수 있습니다. 이것은 또한 Java8이 제공하는 또 다른 새로운 기능인 함수형 프로그래밍입니다.

함수형 프로그래밍을 지원하는 언어는 많습니다. JavaScript에서는 함수를 매개변수로 전달하거나 반환값을 반환하는 것이 매우 일반적인 함수형 언어입니다.

Lambda는 누락된 함수형 프로그래밍 기능을 Java에 추가하여 함수를 일류 시민으로 취급할 수 있도록 합니다.

함수형 프로그래밍 언어에서 람다 표현식의 유형은 함수입니다. Java에서 람다 표현식은 객체이며 특수한 유형의 객체인 기능적 인터페이스에 연결되어야 합니다.

다음으로 기능적 인터페이스의 정의를 살펴보겠습니다.

인터페이스에 추상 메소드가 하나만 있고(Object 클래스의 메소드는 포함되지 않음) 이 인터페이스는 기능적 인터페이스로 간주될 수 있습니다.

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

Runnable 인터페이스 선언을 살펴보겠습니다. Java 8 이후 Runnable 인터페이스에는 해당 인터페이스가 기능적 인터페이스임을 나타내는 추가 FunctionalInterface 주석이 있습니다. 그러나 FunctionalInterface 주석을 추가하지 않고 인터페이스에 추상 메서드가 하나만 있는 경우 컴파일러는 인터페이스를 기능적 인터페이스로 처리합니다.

@FunctionalInterface
public interface MyInterface {
    void test();
    String toString();
}

MyInterface toString()은 Object 클래스의 메서드이기 때문에 이는 기능적 인터페이스이기도 합니다. 여기서는 단지 재정의되고 인터페이스의 추상 메서드 수를 늘리지 않습니다.
(여기서 추가로 언급할 점은 Java8에서는 인터페이스의 메소드가 추상 메소드를 가질 수 있을 뿐만 아니라 기본 메소드라고 하는 구체적으로 구현된 메소드도 가질 수 있다는 것입니다. 이 부분은 나중에 자세히 소개하겠습니다.)
Java에서는 이후 , 람다 표현식은 객체입니다. 그렇다면 이 객체의 유형은 무엇입니까? SwingTest 프로그램을 다시 검토해 보겠습니다. 여기서는 익명 내부 클래스의 형태로 ActionListener 인터페이스 인스턴스가 생성됩니다. ActionListener 인터페이스

jButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                
        System.out.println("Button Pressed!");
    } 
});

의 정의에는 FunctionalInterface 주석이 추가되지 않았지만 여전히 기능적 인터페이스의 정의를 따릅니다.

그래서 Lambda 표현식을 사용하면 기능적 인터페이스의 인스턴스를 생성할 수 있습니다. 즉, Lambda 표현식은 기능적 인터페이스 유형을 반환합니다.

실제로 기능적 인터페이스 인스턴스를 생성하는 방법에는 세 가지가 있습니다(FunctionalInterface 주석 참조):


1. 람다 표현식

2. 메서드 참조(다음 장에서 소개)

3. 챕터 소개)

요약: 이 기사에서 우리는 Java8 학습의 문을 열고, 람다 표현식이 무엇인지 배우고, 기능적 인터페이스의 정의가 무엇인지 이해했으며, 여러 예제를 사용하여 람다 표현식의 편리함을 보여주었습니다.

더 많은 관련 기사를 보려면 다음을 방문하세요. Java 학습 시작하기

위 내용은 람다 표현식 및 기능 인터페이스에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제