Intellij-메서드 참조로 대체 가능
항상 다음과 같은 람다 식을 사용할 때 :
.map(obj -> foo.makeSomething(obj))
IntelliJ는 "메서드 참조로 바꿀 수 있습니다 ..."를 제안합니다. 그리고 내가 시도 할 때 :
.map(Foo::makeSomething)
"정적 컨텍스트에서 비 정적 메서드를 참조 할 수 없습니다"라는 문이 나타납니다.
Idea가 올바르지 않은 경우 메서드 참조를 사용해야한다고 제안하는 이유는 무엇입니까?
당신이 쓸 때 :
map(Foo::makeSomething)
컴파일러는 다음 두 가지 가능성 중 하나를 예상합니다.
로
Foo.makeSomething()
정의되어야하는 람다의 첫 번째 매개 변수 에서 인스턴스 메서드를 호출합니다Foo
.Foo.makeSomething()
정적 메서드 호출 .
람다의 최초의 파라미터를 선언 첫번째 가능성은 컴파일러에 의해 제거 obj
하지 않은 것이다 Foo
.
그리고 오류 메시지에 따라 Foo.makeSomething()
인스턴스 메서드가 있습니다.
비 정적 메서드는 정적 컨텍스트에서 참조 할 수 없습니다. "
따라서 두 번째 가능성 ( Foo.makeSomething()
정적 메서드 호출 )은 정적이 아니므로 합법적 makeSomething()
이지 않습니다.
실제로 원하는 것은 makeSomething()
람다 매개 변수의 일부를 구성하지 않는 변수에 인스턴스 메서드를 적용하는 것 입니다.
할 수 있지만 다른 구문을 사용해야합니다.
대신 지정의 Foo::
사용 foo::
.
이런 식으로 인스턴스 메서드 makeSomething()
가 foo
변수에 적용됩니다 .
map(foo::makeSomething)
IntelliJ 의도
메서드 참조로 대체 될 수있는 람다를보고하는 검사는 의도를 통해 IDE에서 자동으로 리팩터링 할 수도 있습니다.
이를 수행하려면 람다 (그 위의 모든 위치)에 커서를 놓고 상황 별 의도를 표시합니다 ( Alt+Enter
기본적으로). 의도를 확인해야합니다.
람다를 메서드 참조로 바꾸기
일부 스크린 샷 :
참조 URL : https://stackoverflow.com/questions/44874857/intellij-can-be-replaced-with-method-reference
'IT TIP' 카테고리의 다른 글
숨겨진 입력이 true / false 대신 value =“value”를 쓰는 이유는 무엇입니까? (0) | 2020.12.25 |
---|---|
AsyncLocal의 의미는 논리적 호출 컨텍스트와 어떻게 다릅니 까? (0) | 2020.12.25 |
Visual Studio의 알파벳순 방법 (0) | 2020.12.25 |
XSD-두 가지 속성 중 하나가 필요합니까? (0) | 2020.12.25 |
iOS 및 일반 브라우저와 호환되는 JS 라이브러리 (드래그 앤 드롭 포함) (0) | 2020.12.25 |