Intellij - メソッドリファレンスに置き換えることができます。
質問
いつもこのようにラムダ式を使っていると
.map(obj -> foo.makeSomething(obj))
IntelliJは、"メソッド参照に置き換えることができます..."を提案します。そして、私がそれから試みるとき。
.map(Foo::makeSomething)
次のステートメントが表示されます: "非静的メソッドは静的コンテキストから参照できません".Non-staticメソッドは静的コンテキストから参照できません。
なぜIdeaは、それが正しくないのであれば、メソッド参照を使用するよう私に勧めるのですか?
どのように解決するのですか?
あなたが書いているように:
map(Foo::makeSomething)
の場合、コンパイラはこれら二つの可能性のうちどちらかを期待します。
-
を起動する
Foo.makeSomething()
インスタンスメソッドを起動します。Foo
. -
を起動する
Foo.makeSomething()
静的メソッドを呼び出します。
最初の可能性はコンパイラによって排除され、ラムダ宣言の最初のパラメータである
obj
は
Foo
.
そして、エラーメッセージによると
Foo.makeSomething()
はインスタンスメソッドです。
非静的メソッドは静的コンテキストから参照できません"。
というわけで、2つ目の可能性(
Foo.makeSomething()
静的メソッドの呼び出し) も合法ではありません。
makeSomething()
は静的ではないからです。
実際、あなたが望んでいるのは
makeSomething()
インスタンスメソッドをラムダパラメータの一部を構成しない変数に適用することです。
できますが、別の構文を使用する必要があります。
を指定する代わりに
Foo::
を使用します。
foo::
.
このように、インスタンスメソッド
makeSomething()
に適用されます。
foo
変数に適用されます。
map(foo::makeSomething)
IntelliJ インテンション
メソッド参照に置き換えることができるラムダを報告する検査は、意図を通じてIDEによって自動的にリファクタリングすることもできることに注意してください。
これを行うには、カーソルをラムダ (上の任意の場所) に置き、コンテキストに沿った意図を表示します (
Alt+Enter
を表示します。) 意図が表示されるはずです。
ラムダをメソッド参照に置き換える
スクリーンショットをいくつか。
関連
-
Java の switch case 文で必要な定数式の問題の解決法
-
セミコロン期待値エラー解決
-
テストが空であるかどうかを判断するためのオプションの処理
-
[解決済み] android.os.NetworkOnMainThreadException' を修正するにはどうすればよいですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] javadocでメソッドを参照するには?
-
[解決済み] IntelliJ: ワイルドカード・インポートを使用しない
-
[解決済み] IntelliJでマウスオーバー時にJavaDocsのツールチップを表示させる
-
[解決済み】IntelliJ IDEAプロジェクトに外部jar(lib/*.jar)を追加するための正しい方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
プロジェクトの依存関係を解決できない。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ