1. 기능 방법

인터페이스에 메서드가 하나만 있는 경우 해당 인터페이스 유형의 변수에 람다 식 (람다 함수)이 제공하는 값을 할당할 수 있습니다. 이러한 인터페이스는 기능적 인터페이스 (Java가 람다 함수에 대한 지원을 추가한 후) 로 알려지게 되었습니다 .

예를 들어 Java에는 메소드가 Consumer<Type>있는 인터페이스가 있습니다 accept(Type obj). 이 인터페이스가 필요한 이유는 무엇입니까?

Java 8에서 컬렉션에는 컬렉션요소 에 대해 일부 작업을 수행할forEach() 수 있는 메서드가 있습니다 . 여기서 기능적 인터페이스는 액션을 메서드에 전달하는 데 사용됩니다 . Consumer<T>forEach()

컬렉션 의 모든 요소를 ​​표시하는 방법은 다음과 같습니다 .

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach( (s) -> System.out.println(s) );
컬렉션의 모든 요소 표시(람다 식 사용)

컴파일러는 위의 코드를 아래 코드로 변환합니다.

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s));
   }
});
컬렉션의 모든 요소 표시(익명 클래스 사용)

첫 번째 버전은 확실히 두 번째 버전보다 짧습니다. 그리고 람다 표현식이 있는 코드는 읽기 어렵지만 익명 내부 클래스가 있는 코드는 때때로 더 읽기 어렵습니다.



2. 방법 참조

그러나 우리 의 람다 식 코드는 더 짧게 작성할 수 있습니다.

먼저 매개변수 주변의 괄호를s 생략할 수 있습니다 .

list.forEach( (s) -> System.out.println(s) );
전에
list.forEach( s -> System.out.println(s) );
후에

이는 하나의 매개변수가 있는 경우에만 수행할 수 있습니다 . 매개변수가 여러 개인 경우 괄호를 사용해야 합니다 .

둘째, 다음과 같이 작성할 수 있습니다.

list.forEach( System.out::println );
가장 간결한 표기법

이것은 정확히 같은 표기법입니다. 뒤에 괄호가 없다는 점에 유의하십시오 println.

여기에 동일한 코드가 있습니다. 메서드 호출입니다.

object::method
x -> object.method(x)

생각해보세요. list컬렉션의 각 요소에 대해 몇 가지 작업을 수행하고 싶었습니다. 작업이 단일 함수 호출(예: println())인 경우 단순히 함수를 메서드에 매개 변수로 전달하는 것이 좋습니다.

하지만 메서드를 호출하는 대신 메서드를 전달하고 싶다고 컴파일러에 어떻게 설명해야 할까요? 이를 위해 도트 연산자 대신 메서드 이름 앞에 두 개의 콜론을 사용합니다. 하나의 콜론은 이미 삼항 연산자를 나타내는 데 사용됩니다.

이것은 가장 단순하고 간결한 표기법입니다.



3. 생성자

이중 콜론이 있는 메소드 참조는 I/O 스트림으로 작업할 때 매우 편리합니다. 나중에 이것을 보게 될 것입니다.

그동안 메서드 참조를 전달하는 3가지 인기 있는 방법에 대해 이야기해 보겠습니다.

개체의 메서드에 대한 참조

개체의 메서드에 대한 참조를 전달하려면 . 이 코드는 .object::method
x -> object.method(x)

특수 thissuper변수를 개체로 사용할 수 있습니다.

클래스의 메서드에 대한 참조

정적 메서드에 대한 참조를 전달하려면 . 이 코드는 다음과 같은 코드로 변환됩니다.class::methodx -> class.method(x);

생성자에 대한 참조

생성자는 정적 클래스 메서드와 유사하게 동작하므로 생성자에 대한 참조를 전달할 수도 있습니다. 다음과 같이 표시됩니다. .class::new

toArray()예를 들어 컬렉션에 대한 유형 삭제를 우회하고 원하는 배열을 생성할 생성자에 대한 참조를 메서드에 전달할 수 있습니다 .toArray(int[]::new);