"代码为数据"是什么意思?

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表达式和/或匿名内部类意味着什么?

MrS*_*ind 5

当您将功能作为参数传递给另一个方法时,例如当有人单击像您的示例代码那样的按钮时应采取的操作.

Lambda表达式使您能够执行此操作,将功能视为方法参数 = 代码作为数据.

有关更多信息和lambda代码示例,请参阅oracle链接.


Stu*_*rks 3

“代码即数据”的思想与具有一流功能的编程语言的概念密切相关。请参阅有关此主题的维基百科文章。另一个答案中,我讨论了 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 是作为函数式接口实例的对象。