SDS*_*SDS 6 java lambda anonymous-inner-class java-8
我最近遇到了EclipseCon 2014 的演示文稿,在第5页上他们说"Lambda表达式允许您将代码视为数据".
我也遇到了这个示例代码
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println("button clicked");
}
});
Run Code Online (Sandbox Code Playgroud)
来自Richard Warburton的"Java 8 Lambdas:实用功能编程",他说
"这实际上是使用代码作为数据的一个例子 - 我们为按钮提供了一个表示动作的对象."
代码作为数据对于Lambda表达式和/或匿名内部类意味着什么?
“代码即数据”的思想与具有一流功能的编程语言的概念密切相关。请参阅有关此主题的维基百科文章。在另一个答案中,我讨论了 Java 是否具有一流的函数,但该文章还讨论了其他一些问题。
维基百科文章中的定义(引用了 Abelson 和 Sussman,计算机程序的结构和解释,第 1.3 节)特别提到了函数的以下特征,这些特征使它们成为“一流”:
这些都是你用数据做的事情。如果您可以使用函数执行这些相同的操作,那么就像将“代码视为数据”一样。
如果仔细观察 lambda 是如何添加到 Java 编程语言中的,您会发现 lambda 实际上被转换为函数式接口的实例。因此,它是某个对象的实例,因此是 class 的后代Object,并且像 Java 中的所有对象一样,它具有equals(), hashCode(), getClass()etc. 方法,并且引用可以与==等进行比较。但是,我们明确不鼓励您依赖其中任何一个。请参阅我的其他答案以进行更多讨论。实际上,当您在 Java 中使用 lambda 时,感觉就像将代码作为参数传递,或者将其分配给变量。例如,
list.replaceAll(x -> doSomething(x));
Predicate<String> pred = s -> s.length() > 5;
Run Code Online (Sandbox Code Playgroud)
您实际上最终没有考虑这样一个事实:在幕后,lambda 是作为函数式接口实例的对象。