采访:什么是Lambda表达式?

45

最近我进行了两次电话面试。

在这两次面试中,我的最后一个问题都被要求定义Lambda表达式。

我说Lambda表达式是一种代替委托的未命名方法。但不知何故,这似乎还不够。

我发现在电话面试中很难准确地解释这个问题。

有没有人更清楚呢?


3
“让我们开始这次探索”以上的部分:语言集成查询(Language Integrated Query,简称 LINQ)是.NET Framework 3.5中引入的一项技术。它提供了一种在编译时对各种数据源执行查询的方式。这些数据源可以是对象集合、数据库或XML文档等。LINQ包括一组标准查询算子(Standard Query Operators),它们允许开发人员使用类似于SQL的语句对数据进行查询。这些标准查询算子是通过扩展方法(Extension Methods)和Lambda表达式实现的。此外,LINQ还提供了一种将查询结果转换为其他格式的机制,如列表、数组或XML文档等。LINQ的优点在于它可以在不需要学习专门的查询语言的情况下,使用一种通用的语法来查询各种数据源。同时,由于查询是在编译时检查的,因此它可以提供更好的类型安全性和运行时效率。 - Amy B
1
所有的 LINQ 方法都是有名称的,有些方法会将未命名的方法作为参数,例如匿名方法或 Lambda 表达式。 - Greg
我无法相信这么多人回答了这个明显的重复问题。 - John Saunders
不要忘记,如果是人力资源部门进行面试,他们可能只有答案,却不足以理解你的回答在某种程度上意味着什么。 - JB King
重复:什么是Lambda - nawfal
显示剩余2条评论
7个回答

43

Lambda表达式是作为常量值给出的无名函数。它们可以出现在任何其他常量可能出现的地方,但通常被编写为某个其他函数的参数。一个典型的例子是,您将向通用的“排序”程序传递一个比较函数,而不需要定义整个函数(并遭受词法不连续性和名称空间污染),以描述这个比较,您可以只需传递描述比较的lambda表达式。

然而,这种方法忽略了Lambda表达式最重要的特点之一,即它们在其出现的上下文中执行。因此,它们可以使用在该上下文中定义的变量的值。这将函数指针与真正的Lambda表达式区分开来。在支持可变变量的语言中,正确的Lambda表达式提供了改变这些变量的值的能力。

Lambda表达式在所有LISP、Perl、Python和足够新的C++、Objective C、C#和Java 8中都会出现(具有不同的语法形式),但尤其要注意的是,即使C也有处理将函数(或一些借口)作为参数传递的方法,它没有Lambda表达式。它们是具有特定语义的语法元素,这些语义对运行时的要求比C语言设计的要求更高。


3
Lambda表达式在JDK-1.8中已经可以在Java中使用了。我相信它们看起来非常类似于C#中的Lambda表达式,除了Java的“胖箭头”是细的;->而不是=>。 - Matthew Layton

18

lambda表达式是一段无名的暂停代码。

考虑这个匿名的“两个数相乘”的函数(也称为lambda表达式),使用一些非常不具体的符号。

λ(x, y) -> x * y

你的回答非常专注于使用lambda表达式的特定场景(我猜测是C#?),而我怀疑面试官想要更一般性的理解。委托的概念、语言C#和方法的想法都不如了解什么是lambda以及它们是如何工作的来得重要。例如,你可以在纸上使用lambda表达式进行计算,而无需涉及任何方法。


2
我会摒弃“代码”的特定概念:lambda抽象是关于计算的,而不是任何可能描述这种计算的特定语言。只是恰好有些编程语言包括语法来更直接地表示它们,就像大多数流行的语言直接表示代数表达式一样。 - Ian

2

回答您修改后的问题,对于这个问题,您的答案实际上很好。唯一需要改变的是要强调“inline”这个词。

Lambda表达式是一种未命名的方法,可以在需要委托的地方内联编写。


1

也许他们只是想听到LINQ是“语言集成查询”的意思。

话虽如此,如果他们真的想要一个关于“什么是”LINQ由什么组成的解释,我可能会提供比你提供的更多的信息。例如:

LINQ(Language-Integrated Query)是在.NET 3.5中添加的一组语言扩展和框架类,它使查询操作更具功能性。它基于IEnumerable和IQueryable及其泛型对应项的扩展方法,允许在LINQ to Objects中进行延迟执行和通过IQueryable进行远程处理,以及许多其他功能。还对C#和VB.NET进行了语言更改,以支持直接在语言中使用更“自然”的查询语法。


1
实际上,那不是 LINQ,而是“lambda表达式”。严格来说,LINQ 甚至不使用它们。
LINQ 代表“语言集成查询”,特别地,它是“from ... where... select”关键字(即查询语法)被嵌入到语言中的部分。
现在,要让这些关键字发挥作用,就必须添加更多内容到语言(和 CLR)中(如lambda表达式、扩展方法、可枚举类等)。

我刚意识到我搞砸了这个问题。你是对的。问题应该是Lambda表达式。在写作时,我不知何故想到了LINQ。:( - Houman

1

6
请更正链接。 - IConfused

0

他们可能希望你知道,LINQ 是查询 IQueryableIEnumerable 对象的新 DSL。本质上是“从…到…选择…”语法。了解它是如何通过 lambda 和函数式风格实现的可能会让你得到额外的分数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接