类似于创建对象而不是方法的匿名函数?
Anonymous functions similar to creating objects instead of methods?
在学习 Java SE 8 的 Lambda 表达式时,我在一本学习书中看到了以下文字:
Languages that support functional programming concepts have the
ability to create anonymous (unnamed) functions, similar to creating
objects instead of methods in Java.
我完全迷路了,谁能解释一下作者在这里的意思?有什么相似之处?他们如何比较?
我相信作者的意思可能是函数式编程允许函数具有与 java 中的对象相同的状态 - 即它们可以独立存在,而不是 class 的一部分(不同于 Java).
中的方法
措辞似乎特别笨拙,我不完全确定它想表达什么。但我从中学到的一件事是函数的概念类似于对象,因为新函数可以即时创建,并且函数可以包含状态。这是其他语言已经有一段时间的东西,但在 Java 中,它是如此繁琐以至于不切实际,直到 Java 8,引入了 lambda。
这是一个 Java脚本示例,它创建了一个函数,该函数捕获了一些状态,并在每次调用时修改该状态:
function appender (str) {
return function (s1) {
str += s1
return str
}
}
jjs> var a1 = appender("foo")
jjs> var a2 = appender("bar")
jjs> a1("x")
foox
jjs> a1("y")
fooxy
jjs> a2("qq")
barqq
(为此,我使用了 Nashorn jjs
,但其他 Java 脚本实现应该以类似方式工作。)
您可以在 Java 中执行类似的操作,如下所示:
UnaryOperator<String> appender(String str) {
StringBuilder sb = new StringBuilder(str);
return s1 -> sb.append(s1).toString();
}
UnaryOperator<String> a1 = appender("foo");
UnaryOperator<String> a2 = appender("bar");
System.out.println(a1.apply("x"));
System.out.println(a1.apply("y"));
System.out.println(a2.apply("qq"));
输出相同:
foox
fooxy
barqq
Java 代码比较冗长,主要是因为类型声明和 System.out.println
之类的东西。 return 值并不是真正的函数,它是函数接口的一个实例。但基本特征是相同的。一旦你习惯了它,你就会真正开始像对待函数一样对待函数式接口的实例。
当然,在 Java 7 或更早版本中,总是 可能 做这样的事情,使用匿名内部 类 而不是 lambda,但是太麻烦了,几乎没有人想过用这种方式做事。
在学习 Java SE 8 的 Lambda 表达式时,我在一本学习书中看到了以下文字:
Languages that support functional programming concepts have the ability to create anonymous (unnamed) functions, similar to creating objects instead of methods in Java.
我完全迷路了,谁能解释一下作者在这里的意思?有什么相似之处?他们如何比较?
我相信作者的意思可能是函数式编程允许函数具有与 java 中的对象相同的状态 - 即它们可以独立存在,而不是 class 的一部分(不同于 Java).
中的方法措辞似乎特别笨拙,我不完全确定它想表达什么。但我从中学到的一件事是函数的概念类似于对象,因为新函数可以即时创建,并且函数可以包含状态。这是其他语言已经有一段时间的东西,但在 Java 中,它是如此繁琐以至于不切实际,直到 Java 8,引入了 lambda。
这是一个 Java脚本示例,它创建了一个函数,该函数捕获了一些状态,并在每次调用时修改该状态:
function appender (str) {
return function (s1) {
str += s1
return str
}
}
jjs> var a1 = appender("foo")
jjs> var a2 = appender("bar")
jjs> a1("x")
foox
jjs> a1("y")
fooxy
jjs> a2("qq")
barqq
(为此,我使用了 Nashorn jjs
,但其他 Java 脚本实现应该以类似方式工作。)
您可以在 Java 中执行类似的操作,如下所示:
UnaryOperator<String> appender(String str) {
StringBuilder sb = new StringBuilder(str);
return s1 -> sb.append(s1).toString();
}
UnaryOperator<String> a1 = appender("foo");
UnaryOperator<String> a2 = appender("bar");
System.out.println(a1.apply("x"));
System.out.println(a1.apply("y"));
System.out.println(a2.apply("qq"));
输出相同:
foox
fooxy
barqq
Java 代码比较冗长,主要是因为类型声明和 System.out.println
之类的东西。 return 值并不是真正的函数,它是函数接口的一个实例。但基本特征是相同的。一旦你习惯了它,你就会真正开始像对待函数一样对待函数式接口的实例。
当然,在 Java 7 或更早版本中,总是 可能 做这样的事情,使用匿名内部 类 而不是 lambda,但是太麻烦了,几乎没有人想过用这种方式做事。