2010-09-30 68 views
38

我最近有两次电话采访。访谈:什么是Lambda表达式?

在两次采访中,我被问到是否定义Lambda表达式的最后一个问题。

我声称Lambda表达式是代替委托的未命名方法。 但不知何故,这还不够。

我很难在电话采访中精确地解释这一点。

有谁知道更好?

+2

http://stackoverflow.com/questions/471502/what-is-linq/471592#471592上面的“让我们开始这一探索”的一部分。 – 2010-09-30 15:53:18

+1

所有的LINQ方法都被命名。有些人将未命名的方法作为参数,即匿名方法或lambda表达式 – Greg 2010-09-30 15:59:22

+0

我无法相信回答这个明显重复的人数。 – 2010-09-30 19:02:20

回答

33

Lambda表达式是作为常量值给出的无名函数。它们可以出现在任何其他常量的任何地方,但通常作为其他函数的参数写入。典型的例子是,你将一个比较函数传递给一个通用的“排序”例程,而不是去定义整个函数(并引发词法不连续性和名称空间污染)来描述这种比较的麻烦,你可以传递描述比较的lambda表达式。

然而,这忽略了Lambda表达式的一个最重要的特性,那就是它们在外观上下文中执行。因此,他们可以使用在该上下文中定义的变量的值。这将函数指针与真正的lambda表达式区分开来。在支持可变变量的语言中,正确的lambda表达式提供了改变这些变量值的能力。

Lambda表达式在所有LISP,Perl,Python和最新版本的C++,Objective C,C#和Java 8中都出现(使用不同的语法),但特别是在C中,尽管它有办法处理传递函数(或其中的一些借口)作为参数。它们是一种具有特定语义的语法元素,而这些语义对运行时的要求比C要求的要求更高。

+3

从JDK-1.8开始,我相信Lambda表达式在Java中是可用的,除了Java的“Fat Arrow”很薄之外,它们看起来与C#中的Lambda表达式非常相似,反对=> – series0ne 2014-01-02 17:09:49

1

也许他们只是想听到LINQ是“语言集成查询”。这就是说,如果他们真的想要解释“LINQ是什么”组成的,那么我可能会包含更多您提供的信息。喜欢的东西:

LINQ或语言集成查询,是一个集语言添加和框架类添加在.net 3.5,其使得功能更强大的方法来查询操作。它基于IEnumerable和IQueryable的扩展方法以及它们的通用对应方法,它们允许在LINQ to Objects中延迟执行并通过IQueryable进行远程处理,以及许多其他功能。对C#和VB.NET也进行了语言更改,以便直接在语言中支持更“自然”的查询语法。

0

他们可能在寻找您知道LINQ是用于查询IQueryableIEnumerable对象的新DSL。本质上,“从... where ... select ...”语法。知道它在lambdas和函数式风格下实现可能会让你获得奖励积分。

1

那么我说Linq是一个未命名的方法来代替代表。

实际上,这根本不是LINQ,而是“lambda表达式”。从技术上讲,LINQ甚至不使用它们。

LINQ代表“Language Integrated Query”。具体来说,它是“from ... where .. select”关键字(即查询语法即集成纳入语言)。

现在,为了让这些关键字来做事情,在语言(和CLR)中增加了更多(如lambda表达式,扩展方法,Enumerable类等)。

+0

我刚刚意识到我毁了这个问题。你是对的。这个问题一直是Lambda的表达。在写这篇文章的时候,我有一些LINQ的想法。 :( – Houman 2010-10-01 09:11:29

1

要回答您的修改问题,为此,您的答案确实很好。我所做的唯一改变是强调“内联”一词。

Lambda表达式是一种未命名的方法,它被内联写入需要委托的地方。

13

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

考虑这个匿名的“乘以两件事”功能(又名。lambda表达式),使用一些非特定的符号。

λ(x, y) -> x * y 

你的答案是非常具体的,你已经使用Lambda表达式(我猜C#?)的地方,我怀疑面试官问了一个更普遍的认识。代表的概念,C#语言以及方法的概念都与lambda的含义以及它们的工作方式有关。例如,您可以使用lambda表达式on paper进行计算,而不涉及任何方法。

+2

我想远离“代码”这个特定的概念:lambda抽象是关于计算的,而不是任何特定的语言,在这种语言中可能会描述这样的计算。只是有些编程语言包含语法来代表它们或多或少直接就像大多数流行的表达式直接表示代数表达式一样。 – Ian 2014-01-28 21:33:18