IntelliJは、ラムダ式をメソッド参照に置き換えることを提案し続けます。
両者の間に客観的な違いはありますか?
Type[]::new
)。実行時に生成される匿名クラスは同じです。JREはそれらの間で何の違いもありません。したがって、メソッド参照を使用すると、コンパイルされたコードで1つのメソッドを節約できます。一方、ステップバイステップのデバッグを実行するときに、それらのメソッドで停止することはできません…
IntelliJは、ラムダ式をメソッド参照に置き換えることを提案し続けます。
両者の間に客観的な違いはありますか?
Type[]::new
)。実行時に生成される匿名クラスは同じです。JREはそれらの間で何の違いもありません。したがって、メソッド参照を使用すると、コンパイルされたコードで1つのメソッドを節約できます。一方、ステップバイステップのデバッグを実行するときに、それらのメソッドで停止することはできません…
回答:
この機能を言語に追加した理由について、厳密にそうする必要がないことを明確にしてみましょう(すべてのメソッドrefはラムダとして表現できます)。
正解はありません。「常にラムダの代わりにメソッドリファレンスを使用する」または「常にメソッドリファレンスの代わりにラムダを使用する」と言った人は無視してください。
この質問は、「名前付きクラスと匿名クラスをいつ使用する必要があるか」と精神的に非常に似ていますか 答えは同じです。読みやすくなります。確かにどちらか一方のケースは確かにありますが、真ん中には多数の灰色があり、判断が必要です。
メソッド参照の背後にある理論は単純です。名前が重要です。メソッドに名前が付いている場合、最終的にそれを反転させて呼び出すだけの必須のコードバッグではなく、名前でメソッドを参照する方が、多くの場合(常にではありませんが)より明確で読みやすいです。
パフォーマンスやキャラクターのカウントについての議論は、ほとんどがニシンであり、無視する必要があります。目標は、それが何をするのか非常に明確なコードを書くことです。ほとんどの場合(常にではありませんが!)、メソッド参照はこのメトリックで勝つため、それらをオプションとして含めて、それらのケースで使用されます。
メソッドが意図を明確にするか難読化するかに関する重要な考慮事項は、表現されている関数の形状がコンテキストから明らかであるかどうかです。場合によっては(たとえば、map(Person::getLastName)
あるものを別のものにマップする関数が必要であることがコンテキストから明らかであり、このような場合、メソッド参照が有効です。他の場合では、メソッドrefを使用すると、リーダーはどのような種類かを疑問に思う必要があります。関数の説明中です;これは、ラムダが長くても読みやすくなる可能性があることを示す警告です。
最後に、ラムダよりも新しくて奇妙な感じがするため、ほとんどの人は最初はメソッド参照を避け、最初は「読みにくく」なりますが、時間が経つにつれて構文に慣れるようになることがわかりました。一般に、動作を変更し、可能な場合はメソッド参照に引き寄せます。したがって、あなた自身の主観的な最初の「読みにくい」反応は、ほぼ確実に親しみやすさの偏りを伴うことに注意してください。スタイルの意見を述べる前に、両方に慣れる機会を自分に与える必要があります。
LiveData
、にトリガーされたFragment
に変換されたAndroidであり、Androidが同じに戻ったときに別の動作が発生します。 .so質問のために単純化するのに苦労していますEvent
ViewModel
Fragment
複数のステートメントで構成される長いラムダ式は、コードの可読性を低下させる可能性があります。そのような場合、メソッドでそれらのステートメントを抽出し、それを参照することをお勧めします。
もう1つの理由は、再利用性です。いくつかのステートメントのラムダ式をコピーして貼り付ける代わりに、メソッドを作成して、コードのさまざまな場所から呼び出すことができます。
houses.map(House::getName)
とhouses.map(h -> h.getName())
。ラムダは2文字少なくなります。型が明示的ではないことは事実ですが、どのIDEでもわかりますし、型が明らかな場合はラムダを使用する必要があります。私は再利用性についてあなたに同意するかもしれませんが、ラムダは正確に小さいので、大きな特定のメソッドを作成する代わりにそれらを連鎖させることができます。その意味で、小さなメソッドはいくつかの大きく複雑なメソッドよりも再利用可能であり、ラムダの明快さ(そしてある程度までは冗長)のため、読みやすくなっています。
House
非常に害のない例です。どうかThreeStoryRedBrickHouseWithBlueDoors
。私は複数引数のラムダのメソッド参照を好み、ラムダは単一のメソッド呼び出しについてのみであることを強調することもあります。メソッドを参照して間違って行くことにあまりあります:あなたは誤って外部スコープなどからの変数を参照して、使用現場で引数のスペルを間違えかもしれない