ラムダを持つC#またはJavaにはどのような理由がありますか?
質問
ラムダを持つC#またはjavaにはどのような理由がありますか?どちらの言語もそれらに基づいていないため、C#と同じことを行う別のコーディング方法のようです。
もし私が理由を知りたいのであれば、私は対立しているわけではありません。完全な開示の目的で、私は、C ++のバックグラウンドを持ち、Lispの経験がないJavaプログラマーであるため、ポイントを逃しているだけかもしれません。
解決
コードブロックを後で実行する(または格納する)必要がある一般的なユースケースがあります。最も一般的なのはイベントリスナーです。信じられないかもしれませんが、次のコードはJavaでラムダ風の構造を使用しています:
JButton button = new JButton("Push me!");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Pressed!");
}
});
匿名の内部クラスは、非常に冗長ですが、ラムダとして機能します。暗黙的な変換マジックを少し使用することで、Scalaで次の同等なものを作成できます。
val button = new JButton("Push me!")
button.addActionListener { e =>
println("Pressed!")
}
C#を使用すると、デリゲートと(さらに優れた)ラムダを使用して、この種のことが非常に簡単になります。
他のヒント
C#のラムダは、デリゲートを行うための非常に便利なショートカットと考えています。デリゲートの定義を他の場所で検索するのではなく、使用されている場所にコードを置く方がはるかに読みやすくなります。
Syntactic Sugar。
これは、アイデアを表現する便利で読みやすい方法を提供します。この場合、ごく小さな使い捨てメソッドです。内部では、コンパイラはそれをデリゲートとメソッド呼び出しに拡張しますが、それはあなたではなく作業を行うものです。
ラムダを使用すると、より冗長で表現力豊かなコードを記述できます。たとえば、内包表記のリスト ...
ところで、Javaにクロージャを追加する可能性を探る作業が進行中です-それまでは、代わりに匿名クラスを使用する必要があります(ugい)。
C#は、言語設計の特定の学校には純粋ではありません(Javaは、Smalltalkersが純粋なオブジェクト指向言語のように設計したのとは異なります)。 C#はすべてのものからすべての人を対象にしていますが、非常に優れています。 C#は、さまざまなスタイルの最高のプログラミングを1つの高品質で十分にサポートされた言語に収集することに基づいています。それには、手続き型、オブジェクト指向、関数型、動的、ロジックなどのプログラミングスタイルが含まれます。明らかに、これまでのところ、プログラミングの動的スタイルまたは論理スタイルの方法はあまりありませんが、まもなく実現します(動的プログラミングはC#4.0に付属)。
C#の場合、ラムダはLINQを実装するために内部的に使用されます。記事「 LINQの進化とC#の設計への影響を参照してください。 >
Lambdaを使用すると、現在のC ++の定義が使用場所から遠くなることがある関数オブジェクトを使用する方法ではなく、使用場所に近い場所で操作を定義できるため、コードが読みやすくなります。 (これには、ブーストライブラリの一部は含まれていません)。ラムダの重要なポイントは、より簡潔で理解しやすいコードを許可することです。
多くの場合、「最終」を意味することにより、Javaのマルチスレッドを使用してより優れたセキュリティを提供します。オプション。したがって、マルチタスクのエラーが発生しやすくなりません。