Java 8은 Java 역사상 가장 변경된 버전이라고합니다. 여기에는 많은 중요한 새로운 기능이 포함되어 있으며 가장 핵심은 Lambda Expressions 및 Streamapi를 추가하는 것입니다. 둘은 함께 사용할 수 있습니다. 먼저 람다 표현이 무엇인지 살펴 보겠습니다.
Lambda 표현식을 사용하면 코드를 단순하게 읽을 수있을뿐만 아니라 가장 중요한 코드의 양도 크게 줄어든다는 것입니다. 그러나 어느 정도까지 이러한 기능은 Scala와 같은 JVM 언어로 널리 사용되었습니다.
놀랍게도, Scala Community는 놀라운 일입니다. 많은 Java 8 컨텐츠가 Scala에서 이동 한 것처럼 보이기 때문입니다. 어느 정도까지 Java 8의 구문은 Scala보다 더 상세하지만 명확하지는 않지만 많은 말을하지는 않습니다. 가능하다면 Scala와 같은 Lambda 표현을 만들 수 있습니다.
한편으로, Java가 Scala가 Lambda 주변에서 이미 구현 한 기능을 계속 개발하고 구현한다면 Scala가 필요하지 않을 수 있습니다. 반면, 익명의 내부 클래스를 돕는 것과 같은 일부 핵심 기능 만 제공하면 Scala 및 기타 언어가 계속 번성하여 Java를 추월 할 수 있습니다. 실제로 이것은 최상의 결과입니다. 경쟁에서만 진보 할 수 있습니다. 다른 언어는 계속 발전하고 성장하며 구식인지 걱정할 필요가 없습니다.
Lambda Expression, 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 ( "버튼 누르기!");}}); jframe.add (jbutton); jframe.pack (); jframe.setvisible (true); jframe.setDefaultCloseOperation (jframe.exit_on_close); }}이것은 청취 이벤트 버튼을 바인딩하는 스윙 프로그래밍의 코드입니다. 버튼을 클릭하면 콘텐츠가 "ButtonPressed!" 콘솔에서 출력됩니다. 여기서 우리는 리스너에게 바인딩하기 위해 익명의 내부 클래스의 인스턴스를 만듭니다. 그러나 우리가 면밀히 살펴보면, 실제로 우리가 실제로 집중하는 것은 ActionEvent 유형의 매개 변수와 명령문 system.out.println ( "buttonpressed!")이라는 것을 알게 될 것입니다. 콘솔에 출력.
익명의 내부 클래스를 생성 한 이전 프로그램의 코드가 Lambda 표현식으로 대체되는 경우 코드는 다음과 같습니다.
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 ( "버튼 눌린!")); jframe.add (jbutton); jframe.pack (); jframe.setvisible (true); jframe.setDefaultCloseOperation (jframe.exit_on_close);}} 원래 6 줄의 코드 라인에서 코드의 중간 부분의 변경 사항에주의하십시오. 이제 1 줄을 구현할 수 있습니다. 이것은 람다 표현의 간단한 형태입니다.
람다 표현의 구문이
(param1, param2, param3) -> {// todo}여기서 매개 변수의 유형 프로그램은 컨텍스트에 따라 추론 될 수 있지만 모든 유형을 추론 할 수는 없습니다. 현재 선언 된 매개 변수 유형을 표시해야합니다. 매개 변수가 하나만 있으면 브래킷을 생략 할 수 있습니다. TODO 부분에 하나의 코드가있는 경우 외부의 버팀대를 생략 할 수 있습니다. 위의 예에서와 같이
따라서 간결한 코드 외에도 Lambda Expression은 우리에게 어떤 변화가 있습니까?
Java에서는 매개 변수로 함수를 메소드에 전달할 수 없으며 반환 값이 함수의 메소드임을 선언 할 수 없다는 것을 기억합시다. Java 8 이전에는 대답이 예였습니다.
따라서 위의 예에서는 실제로 코드 로직을 리스너에게 매개 변수로 전달하여 익명의 내부 클래스를 매개 변수로 사용할 필요없이 이벤트가 트리거 될 때이를 수행 할 수 있다고 말합니다. 이것은 또한 Java 8 : 기능 프로그래밍이 가져온 또 다른 새로운 기능입니다.
기능 프로그래밍을 지원하는 많은 언어가 있습니다. JavaScript에서는 함수를 매개 변수로 전달하는 것이 매우 일반적입니다. JavaScript는 매우 일반적인 기능적 언어입니다.
Lambda는 Java에 누락 된 기능 프로그래밍 기능을 추가하여 기능을 일류 시민으로 취급 할 수 있습니다.
기능적 프로그래밍 언어에서 Lambda 표현식의 유형은 기능입니다. Java에서는 Lambda 표현식이 객체이며 특수 객체 유형 - 기능 인터페이스에 연결되어야합니다.
다음으로 기능 인터페이스의 정의를 살펴 보겠습니다.
인터페이스에 초록 메소드가 하나만 있고 (객체 클래스의 메소드가 포함되지 않음),이 인터페이스는 기능 인터페이스로 간주 될 수 있습니다.
@functionalInterFacePublic interface runnable {/** * 인터페이스 <code> runnable </code>를 구현하는 객체를 사용하는 경우 스레드를 만들기 위해 * 스레드를 시작하면 객체의 * <code> run </code> 메소드가 별도로 실행되는 * 스레드에서 호출되도록합니다. * <p> * 방법 <code> run </code>의 일반 계약은 그것이 어떤 조치를 취할 수 있다는 것입니다. * * @see java.lang.thread#run () */ public actract void run ();}런닝 가능한 인터페이스의 진술을 살펴 보겠습니다. Java 8 후, 런닝 가능한 인터페이스에는 추가 기능적 인터페이스 주석이있어 인터페이스가 기능 인터페이스임을 나타냅니다. 그러나 Functioninterface 주석을 추가하지 않으면 인터페이스에 초록 메소드 만있는 경우 컴파일러는 인터페이스를 기능 인터페이스로 간주합니다.
@functionalInterFacePublic interface myinterface {void test (); String toString ();}ToString ()는 객체 클래스의 메소드이기 때문에 MyInterface도 기능 인터페이스이지만 여기에서 다시 작성되며 인터페이스의 추상 방법의 수를 증가시키지 않습니다.
(여기서 언급하면, Java 8에서는 인터페이스의 메소드에는 추상적 인 메소드가있을 수있을뿐만 아니라 구체적인 구현 방법이 있습니다. 기본 메소드라고하며 나중에 자세히 도입됩니다.
Java에서는 Lambda 표현이 대상입니다. 그렇다면이 개체의 유형은 무엇입니까? 익명의 내부 클래스에서 ActionListener 인터페이스 인스턴스가 생성되는 SwingTest 프로그램을 검토해 봅시다.
jbutton.addactionListener (new ActionListener () {@override public void ActionPerformed (ActionEvent e) {System.out.println ( "버튼 누르기!");}});람다 표현으로 개선
jbutton.addactionListener (e-> system.out.println ( "버튼 눌린!"));
즉, Lambda 표현식을 사용하여 ActionListener 인터페이스의 인스턴스를 작성한 다음 ActionListener 인터페이스의 정의를 살펴 봅니다.
공개 인터페이스 actionListener는 eventListener를 확장합니다. { /*** 작업이 발생하면 호출됩니다. */ public void ActionPerformed (ActionEvent e);} 추상 방법은 하나뿐입니다. functioninterface 주석이 추가되지는 않지만 기능 인터페이스의 정의도 준수합니다. 컴파일러는 이것을 기능 인터페이스로 간주합니다.
따라서 Lambda 표현식을 사용하면 기능 인터페이스 인스턴스가 생성 될 수 있습니다. 즉, Lambda Expression은 기능적 인터페이스 유형을 반환합니다.
실제로 기능 인터페이스 인스턴스를 만드는 세 가지 방법이 있습니다 (FunctionalInterface 주석 참조).
1. 람다 표현
2. 방법 인용
3. 생성자 메소드 참조
요약
위의 내용은 Java 8의 Lambda 표현 및 기능적 인터페이스에 대한 간단한 이해에 관한이 기사에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨주십시오.