IT TIP

Intellij-메서드 참조로 대체 가능

itqueen 2020. 12. 25. 10:40
반응형

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

반응형