1. ホーム
  2. java

Intellij - メソッドリファレンスに置き換えることができます。

2023-10-12 02:12:35

質問

いつもこのようにラムダ式を使っていると

.map(obj -> foo.makeSomething(obj))

IntelliJは、"メソッド参照に置き換えることができます..."を提案します。そして、私がそれから試みるとき。

.map(Foo::makeSomething)

次のステートメントが表示されます: "非静的メソッドは静的コンテキストから参照できません".Non-staticメソッドは静的コンテキストから参照できません。

なぜIdeaは、それが正しくないのであれば、メソッド参照を使用するよう私に勧めるのですか?

どのように解決するのですか?

あなたが書いているように:

map(Foo::makeSomething)

の場合、コンパイラはこれら二つの可能性のうちどちらかを期待します。

  • を起動する Foo.makeSomething() インスタンスメソッドを起動します。 Foo .

  • を起動する Foo.makeSomething() 静的メソッドを呼び出します。

最初の可能性はコンパイラによって排除され、ラムダ宣言の最初のパラメータである objFoo .

そして、エラーメッセージによると Foo.makeSomething() はインスタンスメソッドです。

非静的メソッドは静的コンテキストから参照できません"。

というわけで、2つ目の可能性( Foo.makeSomething() 静的メソッドの呼び出し) も合法ではありません。 makeSomething() は静的ではないからです。


実際、あなたが望んでいるのは makeSomething() インスタンスメソッドをラムダパラメータの一部を構成しない変数に適用することです。

できますが、別の構文を使用する必要があります。

を指定する代わりに Foo:: を使用します。 foo:: .

このように、インスタンスメソッド makeSomething() に適用されます。 foo 変数に適用されます。

map(foo::makeSomething)


IntelliJ インテンション

メソッド参照に置き換えることができるラムダを報告する検査は、意図を通じてIDEによって自動的にリファクタリングすることもできることに注意してください。

これを行うには、カーソルをラムダ (上の任意の場所) に置き、コンテキストに沿った意図を表示します ( Alt+Enter を表示します。) 意図が表示されるはずです。

ラムダをメソッド参照に置き換える

スクリーンショットをいくつか。