C# 或 java 有 lambda 的原因是什么?这两种语言都不是以它们为基础的,它似乎是另一种编码方法,可以完成与 C# 相同的事情。
我不是在对抗,如果有原因我想知道原因。出于全面披露的目的,我是一名具有 C++ 背景且没有 lisp 经验的 Java 程序员,我可能只是错过了重点。
8 回答
有一些常见的用例需要传递(或存储)一个稍后执行的代码块。最常见的是事件监听器。信不信由你,以下代码在 Java 中使用了 lambda-ish 结构:
JButton button = new JButton("Push me!");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Pressed!");
}
});
匿名内部类充当 lambda,尽管它非常冗长。通过一点隐式转换魔法,我们可以在 Scala 中编写以下等价物:
val button = new JButton("Push me!")
button.addActionListener { e =>
println("Pressed!")
}
C# 使用委托和(甚至更好的)lambda 使这种事情变得相当容易。
我认为 C# 中的 lambdas 是一种非常方便的代理方式。将代码放在使用它的地方更具可读性,而不必在其他地方搜索委托定义。
语法糖。
它提供了一种方便且更具可读性的方式来表示一个想法,在这种情况下是一种很小的一次性方法。在引擎盖下,编译器将其扩展为委托和方法调用,但它是在做这项工作的人,而不是你。
Lambda 允许您编写更少冗长、更具表现力的代码。例如,列表推导...
顺便说一句,正在探索向 Java 添加闭包的可能性 - 同时有必要使用匿名类(丑陋)。
C# 并不追求纯粹的语言设计学派(与 Java 不同,Java 是由 Smalltalkers 设计为某种纯粹的 OO 语言)。C# 是面向所有人的,而且它非常擅长。C# 的基础是将各种编程风格中的精华汇集到一种高质量、得到良好支持的语言中。这包括程序、面向对象、功能、动态、逻辑等风格的编程。显然,到目前为止,它还没有太多动态或逻辑风格的编程方式,但这很快就会到来(动态编程随 C# 4.0 而来)。
在 C# 的情况下,内部使用 lambda 来实现 LINQ。请参阅文章LINQ 的演变及其对 C# 设计的影响
Lambda 允许更易读的代码,因为它们允许在更接近使用点的地方定义操作,而不是像当前使用函数对象的 C++ 方法,其定义有时远离使用点。(这不包括一些 boost 库)。我认为 lambdas 的关键在于它们允许更简洁和易于理解的代码。
通过在许多情况下暗示“最终”选项,它们使用 Java 中的多线程提供了更好的安全性。所以你在多任务处理中不容易出错。