匿名函数类似于创建对象而不是方法?

时间:2015-01-13 08:52:42

标签: java java-8 lambda

在研究Java SE 8的Lambda表达式时,我在一本学习手册中看到了以下文字:

  

支持函数式编程概念的语言具有   能够创建匿名(未命名)功能,类似于创建   对象而不是Java中的方法。

我完全迷失了,有人能解释作者的意思吗?相似之处是什么?他们如何比较?

2 个答案:

答案 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执行类似的操作总是可能,但它太麻烦了,几乎没有人想过这样做方式。