在研究Java SE 8的Lambda表达式时,我在一本学习手册中看到了以下文字:
支持函数式编程概念的语言具有 能够创建匿名(未命名)功能,类似于创建 对象而不是Java中的方法。
我完全迷失了,有人能解释作者的意思吗?相似之处是什么?他们如何比较?
答案 0 :(得分:1)
我相信作者可能意味着函数式编程允许函数与java中的对象具有相同的状态 - 即它们可以独立存在,而不是类的一部分(与Java中的方法不同)。
答案 1 :(得分:1)
措辞似乎特别笨拙,我不完全确定它想说的是什么。但是我从中得到的一件事是这个函数的概念类似于对象,因为新函数可以在运行中创建,函数可以包含状态。这是其他语言已经存在了一段时间的东西,但是在Java中它是如此繁琐以至于在Java 8之后变得不切实际,引入了lambdas。
这是一个JavaScript示例,它创建一个已捕获某些状态的函数,并在每次调用时修改此状态:
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
,但其他JavaScript实现也应该类似。)
你可以用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
之类的东西。返回值实际上不是一个函数,它是一个功能接口的实例。但基本功能是相同的。一旦你习惯了它,你就像功能一样开始处理功能接口的实例。
当然,在Java 7或更早版本中使用匿名内部类而不是lambdas执行类似的操作总是可能,但它太麻烦了,几乎没有人想过这样做方式。