C#またはJavaにラムダがある理由は何ですか? どちらの言語もそれらに基づいていません。C# が既に行ったのと同じことを行うための別のコーディング方法のようです。
私は対立しているわけではありません。理由がある場合は、その理由を知りたいです。完全な開示の目的のために、私は C++ のバックグラウンドを持つ Java プログラマーであり、Lisp の経験はありません。要点を見逃しているだけかもしれません。
8 に答える
後で実行するためにコードのブロックを渡す (または保存する) 必要がある一般的なユースケースがあります。最も一般的なのは、イベント リスナーです。信じられないかもしれませんが、次のコードは 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# のラムダは、デリゲートを行うための非常に便利なショートカットだと思います。デリゲート定義を他の場所で検索するよりも、コードが使用されている場所にコードがある方がはるかに読みやすくなります。
構文シュガー。
これは、アイデアを表現するための便利で読みやすい方法を提供します。この場合は、小さな使い捨て方法です。内部的には、コンパイラはそれをデリゲートとメソッド呼び出しに拡張しますが、それはあなたではなく、作業を行うものです。
ラムダを使用すると、冗長で表現力の高いコードを記述できます。たとえば、リスト内包表記...
ところで、Java にクロージャを追加する可能性を探る作業が進行中です。それまでの間、代わりに匿名クラスを使用する必要があります (醜い)。
C# は、言語設計の特定の流派に純粋さを求めるつもりはありません (純粋な OO 言語として Smalltalker によって設計された Java とは異なります)。C# は、すべての人にすべてのものを提供しようとしていますが、それはかなり得意です。C# は、さまざまなスタイルのプログラミングの最良のものを 1 つの高品質で十分にサポートされた言語に集めることに基づいています。これには、手続き型、オブジェクト指向、関数型、動的、ロジックなどのスタイルのプログラミングが含まれます。明らかに、これまでのところ、プログラミングの動的または論理スタイルの方法はあまりありませんが、それは間もなく実現します (動的プログラミングは C# 4.0 で導入されます)。
C# の場合、LINQ を実装するためにラムダが内部的に使用されます。記事「LINQ の進化と C# の設計への影響」を参照してください。
ラムダは、関数オブジェクトを使用する現在の C++ メソッドのように、定義が使用ポイントから遠く離れているのではなく、操作を使用ポイントの近くで定義できるという点で、より読みやすいコードを可能にします。(一部のブースト ライブラリは含まれません)。ラムダの重要なポイントは、コードをより簡潔で理解しやすいものにできることだと思います。
They offer better security using the multi threading in Java by implying in many cases the "final" option. So you are not error prone for multitasking.