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)
특수 this
및 super
변수를 개체로 사용할 수 있습니다.
클래스의 메서드에 대한 참조
정적 메서드에 대한 참조를 전달하려면 . 이 코드는 다음과 같은 코드로 변환됩니다.class::method
x -> class.method(x);
생성자에 대한 참조
생성자는 정적 클래스 메서드와 유사하게 동작하므로 생성자에 대한 참조를 전달할 수도 있습니다. 다음과 같이 표시됩니다. .class::new
toArray()
예를 들어 컬렉션에 대한 유형 삭제를 우회하고 원하는 배열을 생성할 생성자에 대한 참조를 메서드에 전달할 수 있습니다 .toArray(int[]::new);
GO TO FULL VERSION