Java 8에 무엇이 추가되었습니까? 람다 표현식

Cover image by Iswanto Arif on Unsplash



이 기사를 통해 Java 8 업데이트에 추가된 기능을 설명하는 짧은 시리즈를 시작합니다. 오늘 저는 이번 릴리스의 주요 화제인 람다 식(람다라고도 함)에 초점을 맞출 것입니다.

이 시리즈는 세 부분으로 나뉩니다(링크는 각 블로그 게시물이 게시될 때마다 업데이트됩니다).
  • 1부. 람다식(이것)
  • 파트 2. 스트림(곧)
  • 파트 3. 선택 사항(곧)

  • 람다 표현식



    Java를 배우기 시작하고 이미 명령줄 예제를 통과했다면 데스크톱 애플리케이션을 만들고 싶을 것입니다. 그리고 이것을 위해 아마도 JavaFX 라이브러리를 사용합니다(적어도 제 경우였습니다).

    대부분의 JavaFX 애플리케이션에서는 사용자가 트리거할 수 있는 이벤트를 처리해야 합니다. 예를 들어 버튼을 누르면 처리해야 하는 Event 객체가 생성됩니다.

    따라서 사용자가 버튼을 클릭하면 트리거될 작업을 할당해야 합니다. 이 작업을 위해 우리는 일반적으로 anonymous inner class 을 선언합니다. 여기에는 필요한 작업을 수행하는 메서드가 하나만 있습니다.

    button.setOnAction(new EventHandler<ActionEvent>() {
           @Override
           public void handle(ActionEvent e) {
               System.out.println("Button clicked");
           }
    });
    


    위의 코드가 매우 간단하더라도 많은 작성이 필요하고 코드가 커지기 시작하면 준비도 어려워집니다. 운 좋게도 람다 식 덕분에 더 간결하게 작성할 수 있습니다.

    button.setOnAction( (e) -> System.out.println("Button clicked") );
    


    와! 짧지만 거기에 무슨 일이?

    람다 식 구문은 세 부분으로 구성됩니다. 첫 번째는 (e) 익명 내부 클래스의 추상 메소드 매개변수를 포함하는(또는 포함하지 않는) 대괄호입니다. 람다는 단일 추상 메서드에서만 사용할 수 있다는 것을 기억하는 것이 정말 중요합니다.

    우리의 경우 ActionEvent 객체는 e 참조로 표현됩니다. 메소드에 매개변수가 없으면 대신 for Runnable 인터페이스와 같이 simple()을 사용할 수 있습니다.

    Runnable r1 = () -> System.out.println("I'm in outside main thread!");
    


    마지막으로 method는 Comperator interface method compare 와 같이 둘 이상의 인수를 가질 수 있습니다.

    Comparator<User> userComperator = 
    (User first, User second) ->  first.email().compareTo(second.email());
    


    위의 예에서 인수 유형(사용자)을 포함하지 않을 수도 있지만 명확성을 위해 추가하는 것이 좋습니다.

    다음으로 인수 뒤에 새로 도입된 오른쪽 화살표-> 연산자가 있습니다.

    그리고 마지막으로 구현된 메서드의 본문이 있습니다. 일반적으로 한 줄의 코드이지만 더 필요한 경우 {} 대괄호로 묶을 수 있습니다.

    button.setOnAction( (e) ->  {
      System.out.println("Button clicked");
      label.setText("Clicked");
    });
    


    메서드가 값을 반환해야 하는 경우 일반 메서드에서와 같이 return 문을 사용할 수 있습니다.

    메소드 참조(::)



    밀접하게 관련되어 있고 람다 식과 함께 소개된 또 다른 주제는 메서드 참조입니다. 간단히 말해서, new 연산자::를 사용하면 객체 또는 기본 유형과 마찬가지로 메서드를 참조에 할당할 수 있습니다. 이 접근 방식을 사용하면 개체에서 메서드를 추출하여 실행하지 않고 다른 위치에 전달할 수 있습니다.

    Object objectInstance = new Object();
    IntSupplier equalsMethodOnObject = objectInstance::hashCode;
    System.out.println(equalsMethodOnObject.getAsInt());
    


    위에서 우리는 참조IntSupplier에 hashCode 메소드를 할당합니다. 그런 다음 코드에서 원하는 위치에 전달할 수 있습니다.

    메서드 참조를 사용하여 정적 메서드(클래스의 인스턴스를 만들지 않고) 또는 생성자를 할당할 수도 있습니다.

    참고문헌


  • Java 8: Lambdas, Part 1 on oracle.com
  • Java Lambda Expressions on tutorials.jenkov.com
  • Java 8 Method Reference: How to Use it on codementor.io
  • JavaFX 8 Event Handling Examples on code.makery.ch
  • 좋은 웹페이지 즐겨찾기