>Java >java지도 시간 >메소드 참조가 람다 표현식과 동일하지 않은 경우는 언제입니까?

메소드 참조가 람다 표현식과 동일하지 않은 경우는 언제입니까?

DDD
DDD원래의
2024-11-04 00:29:30316검색

When is a Method Reference Not Equivalent to a Lambda Expression?

메서드 참조와 람다 표현식: System.out::println의 동등성 탐색

System.out과 같은 메서드 참조를 활용하는 경우 ::println, 함수는 먼저 System.out을 평가하고 결과 값을 람다 식으로 캡처합니다. 예를 들어 이 메서드 참조에 해당하는 람다는 다음과 같습니다.

<code class="java">Consumer<Integer> consumer = System.out::println;</code>

이 람다 식은 아래 코드와 유사하게 동작합니다.

<code class="java">Consumer<Integer> consumer = new Consumer<Integer>() {
    @Override
    public void accept(Integer i) {
        System.out.println(i);
    }
};</code>

그러나 메서드 참조 System.out은 다음과 같습니다. :println은 컴파일 타임에 항상 System.out을 평가하므로 람다 식에 비해 이점을 제공합니다. 람다 식의 경우 메서드가 호출될 때마다 System.out이 평가됩니다.

메서드 참조와 완전히 동일한지 확인하려면 다음 코드를 사용해야 합니다.

<code class="java">PrintStream printStream = Objects.requireNonNull(System.out);
Consumer<Integer> consumer = o -> printStream.println(o);</code>

여기서 printStream은 System.out 값을 캡처하는 변수로, System.out에 대한 이후 변경 사항이 이 소비자에게 영향을 미치지 않도록 보장합니다.

위 내용은 메소드 참조가 람다 표현식과 동일하지 않은 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.