Java 8이라고 하면 가장 먼저 떠오르는 것은 람다(클로저)와 가상 확장 메서드(기본 메서드)입니다. 이 기능은 오랫동안 주요 기술 웹 사이트에서 과장되어 왔으며 이번 컨퍼런스에서 가장 먼저 이야기할 기능이기도 합니다. Java 8 시리즈(JEP126 http://openjdk.java.net/jeps/126)부터 jdk8의 일부 라이브러리는 람다 표현식을 사용하여 재설계되었습니다. 이를 이해하는 것은 Java 8의 새로운 기능을 배우는 데 매우 중요합니다.
1. 기능적 인터페이스
기능적 인터페이스(기능적 인터페이스는 기능적 인터페이스라고도 부르지만 실제로는 동일합니다.) 간단히 말해서, 기능적 인터페이스는 하나의 메서드만 포함하는 인터페이스입니다. 예를 들어 Java 표준 라이브러리의 java.lang.Runnable 및 java.util.Comparator는 일반적인 기능 인터페이스입니다. Java 8은 @FunctionalInterface를 주석으로 제공합니다. 그러나 인터페이스가 기능적 인터페이스(즉, 하나의 메소드만 포함하는 인터페이스)를 충족하는 한 가상 머신은 이를 자동으로 결정합니다. 인터페이스에 @FunctionalInterface 주석을 사용하여 선언하는 것이 가장 좋습니다. 이렇게 하면 팀의 다른 사람이 실수로 인터페이스에 새 메서드를 추가하는 것을 방지할 수 있습니다.
Java의 람다는 단독으로 나타날 수 없습니다. 이를 담기 위해서는 기능적 인터페이스가 필요합니다. 람다 표현식 메소드 본문은 실제로 기능적 인터페이스의 구현입니다.
2. 람다 구문
세 부분으로 구성되어 있습니다.
1. 괄호 안의 쉼표로 구분된 형식 매개변수입니다. 매개변수는 기능적 인터페이스의 메소드 매개변수입니다.
2. 화살표 기호: ->
3. 메서드 본문은 표현식일 수도 있고 코드 블록일 수도 있습니다. 메서드 본문은 함수형 인터페이스의 메서드 구현이므로 {}로 래핑해야 하며 반환 값이 필요합니다. 예외가 있습니다. 기능적 인터페이스의 메서드 반환 값이 void이면 {}가 필요하지 않습니다.
전체적으로 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
(매개변수) -> 표현식 또는 (매개변수) -> { 문 }
쉽게 이해할 수 있도록 전체 예를 참조하세요.
다음과 같이 코드 코드를 복사합니다.
/**
* 람다 표현식 테스트
*
* @author 벤하일
*/
공개 클래스 TestLambda {
공개 정적 무효 runThreadUseLambda() {
//Runnable은 void를 반환하는 매개 변수 없는 실행 메서드만 포함하는 함수 인터페이스입니다.
//따라서 람다 표현식의 왼쪽에는 매개변수가 없고 오른쪽에는 반환값이 없습니다. 단지 문장을 인쇄할 뿐입니다.
new Thread(() ->System.out.println("람다로 구현된 스레드")).start();
}
공개 정적 무효 runThreadUseInnerClass() {
//이 방법에 대해서는 많이 이야기하지 않겠습니다. 이전 버전에서는 일반적인 접근 방식이었습니다.
새로운 스레드(새로운 Runnable() {
@보수
공개 무효 실행() {
System.out.println("내부 클래스에 의해 구현된 스레드");
}
}).시작();
}
공개 정적 무효 메인(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
람다 표현식을 사용하여 설계된 코드가 더 간결하고 가독성이 높다는 것을 알 수 있습니다.
3. 방법 참조
실제로 이는 람다 식을 작성하는 단순화된 방법입니다. 실제로는 람다 식의 메서드 본문 구현입니다. 왼쪽은 컨테이너(클래스 이름 또는 인스턴스 이름일 수 있음)입니다. 가운데는 "::"이고 오른쪽은 해당 메소드 이름입니다. 아래와 같이:
다음과 같이 코드를 복사합니다. ObjectReference::methodName
일반적인 방법 인용 형식은 다음과 같습니다.
정적 메소드인 경우 ClassName::methodName입니다. Object::equals와 같은
인스턴스 메서드인 경우 Instance::methodName입니다. Object obj=new Object();obj::equals;
생성자입니다. ClassName::new입니다.
더 쉽게 이해할 수 있도록 전체 예를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다.
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
*
* @author 벤하일
*/
공개 클래스 TestMethodReference {
공개 정적 무효 메인(String[] args) {
JFrame 프레임 = new JFrame();
프레임.setLayout(new FlowLayout());
프레임.setVisible(true);
JButton 버튼1 = new JButton("클릭하세요!");
JButton 버튼2 = new JButton("나도 클릭하세요!");
프레임.getContentPane().add(button1);
프레임.getContentPane().add(button2);
//여기서 addActionListener 메소드의 매개변수는 기능적 인터페이스인 ActionListener입니다.
//람다 표현식 메소드 사용
버튼1.addActionListener(e -> { System.out.println("여기에 Lambda 구현이 있습니다."); });
//메소드 참조 메소드 사용
버튼2.addActionListener(TestMethodReference::doSomething);
}
/**
* 기능적 인터페이스 ActionListener의 구현 방법은 다음과 같습니다.
* @param e
*/
공개 정적 무효 doSomething(ActionEvent e) {
System.out.println("여기에 메소드 참조 구현이 있습니다.");
}
}
doSomething 메소드는 람다 표현식을 구현한 것임을 알 수 있습니다. 이것의 장점은 람다 메소드가 매우 길고 코드의 가독성에 영향을 미친다고 느낄 경우 메소드 참조가 해결책이라는 것입니다.
4. 요약
위의 내용은 람다 표현식 구문의 전체 내용입니다. 모든 사람이 람다 표현식에 대해 어느 정도 이해하고 있다고 생각합니다. 그러나 코드가 단순하면 많은 시청자에게 깊은 인상을 남기지 못할 것입니다. 사실, 그다지 흥미롭지는 않습니다. Java 8에 람다를 도입해야 하는 이유는 람다 때문입니다. 표현식은 컬렉션에 대한 데이터의 멀티 스레드 또는 멀티 코어 처리를 단순화하고 더 빠른 컬렉션 처리 속도를 제공할 수 있습니다. 이에 대해서는 JEP126의 기능을 세 부분으로 나누어 설명합니다. 작성할 내용이 너무 많습니다. 이 부분은 독자에게 람다 식 및 메서드 참조의 구문과 개념을 친숙하게 만듭니다. 두 번째 부분은 가상 확장 메서드(기본 메서드)에 대한 내용입니다. 대규모 데이터 수집 및 솔루션을 통해 람다 표현식의 힘을 알아보세요. 계속 지켜봐 주시기 바랍니다. . . .