다음 코드 조각을 고려하세요.
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
Consumer 인터페이스에 따라 void accept(T t)로 정의됩니다. 따라서 소비 메소드가 문자열을 반환할 때 Lambda3을 할당하면 당황스러울 수 있습니다. 놀랍게도 Lambda4도 할당되어 있습니다.
이 시나리오는 Java의 메소드 참조의 유연한 설계에 기인합니다. 이는 메소드를 직접 호출하는 것과 동일한 방식으로 기능적 인터페이스에 대한 메소드의 적응을 허용합니다. 즉, 값 반환 메서드를 호출하고 반환된 값을 무시할 수 있습니다.
Lambda 표현식은 두 가지 형식으로 제공됩니다.
표현식 s -> s는 명령문이 아니기 때문에 s는 void 호환이 아닙니다. 그러나 s -> s.toString()은 메소드 호출이 명령문이기 때문에 가능합니다.
문으로 사용할 수 있는 표현식(Java 언어 사양 §14.8에 따름)은 다음과 같습니다.
(arg) -> methodReturningVoid(arg)는 값과 호환되지 않는 유일한 표현식 형식입니다.
위 내용은 반환 값이 포함된 Java 메서드 참조가 `소비자` 인터페이스에서 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!