【问题标题】:What reason is there for C# or Java having lambdas?C# 或 Java 有 lambda 的原因是什么?
【发布时间】:2008-10-16 18:56:11
【问题描述】:

C# 或 java 有 lambda 的原因是什么?这两种语言都不是基于它们,它似乎是另一种编码方法,可以完成 C# 已经做过的事情。
我不是在对抗,如果有原因我想知道原因。出于全面披露的目的,我是一名具有 C++ 背景且没有 lisp 经验的 Java 程序员,我可能只是错过了重点。

【问题讨论】:

    标签: c# java lambda


    【解决方案1】:

    有一些常见的用例需要传递(或存储)一段代码以便稍后执行。最常见的是事件监听器。信不信由你,以下代码在 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 使这种事情变得相当容易。

    【讨论】:

    • 我可以通过您的示例看到原因,我还可以看到尝试调试会导致很多混乱,直到一个人学习 lambdas 非常好。
    • 实际上,根据我的经验,富含 lambda 的代码比不使用 lambda 编写的等效代码更容易调试。一旦您开始考虑它们,它们就非常直观,并且明智地使用它们可以减少体积(这显然有助于任何与代码相关的任务,包括调试)。
    • 委托 lambdas(更类似于匿名方法)和 Expression lambdas 之间的细微差别也是一个主要考虑因素,但很好。
    【解决方案2】:

    我认为 C# 中的 lambdas 是执行委托的一种非常方便的捷径。将代码放在使用它的地方会更易读,而不必在其他地方搜索委托定义。

    【讨论】:

    • 匿名函数和 lambda 在 C# 中是不同的 - blogs.msdn.com/ericlippert/archive/2007/01/10/…
    • @johnstok - 指出这一点有点晚了,但那篇文章说它们只是从 C# 编译器的实现者(该博客的作者)的角度来看不同。
    【解决方案3】:

    语法糖。

    它提供了一种方便且更具可读性的方式来表示一个想法,在这种情况下是一种微小的一次性方法。在引擎盖下,编译器将其扩展为委托和方法调用,但工作的是它,而不是你。

    【讨论】:

      【解决方案4】:

      Lambda 让您可以编写更少冗长、更具表现力的代码。比如list comprehensions...

      顺便说一句,正在探索向 Java 添加闭包的可能性 - 同时有必要使用匿名类(丑陋)。

      【讨论】:

        【解决方案5】:

        C# 并不追求纯粹的特定语言设计学派(与 Java 不同,Java 是由 Smalltalkers 设计为某种纯粹的 OO 语言)。 C# 是面向所有人的,而且它非常擅长。 C# 的基础是将各种编程风格中的精华汇集到一种高质量、得到良好支持的语言中。这包括程序、面向对象、功能、动态、逻辑等风格的编程。显然,到目前为止,它还没有太多动态或逻辑风格的编程方式,但这很快就会到来(动态编程随 C# 4.0 一起出现)。

        【讨论】:

          【解决方案6】:

          在 C# 的情况下,内部使用 lambda 来实现 LINQ。见文章The Evolution Of LINQ And Its Impact On The Design Of C#

          【解决方案7】:

          Lambda 允许更易读的代码,因为它们允许在更接近使用点的地方定义操作,而不是像当前使用函数对象的 C++ 方法那样定义有时远离使用点。 (这不包括一些 boost 库)。我认为 lambdas 的关键在于它们允许更简洁和易于理解的代码。

          【讨论】:

            【解决方案8】:

            通过在许多情况下暗示“最终”选项,它们使用 Java 中的多线程提供了更好的安全性。所以你在多任务处理中不容易出错。

            【讨论】:

              猜你喜欢
              • 2014-07-30
              • 2010-10-31
              • 2017-04-10
              • 1970-01-01
              • 2013-04-17
              • 1970-01-01
              • 1970-01-01
              • 2021-05-23
              • 1970-01-01
              相关资源
              最近更新 更多