Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名函数类似于创建对象而不是方法?_Java_Java 8_Lambda - Fatal编程技术网

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

Java 匿名函数类似于创建对象而不是方法?,java,java-8,lambda,Java,Java 8,Lambda,在研究Java SE 8的Lambda表达式时,我在一本研究书中看到了以下文本: 支持函数式编程概念的语言具有 创建匿名(未命名)函数的能力,类似于创建 对象而不是Java中的方法 我完全迷路了,有人能解释一下作者在这里的意思吗?有什么相似之处?它们是如何比较的?我相信作者的意思可能是,函数式编程允许函数与java中的对象具有相同的状态,即它们可以独立存在,而不属于类(与java中的方法不同)。这个措辞似乎特别笨拙,我不完全确定它想说什么。但我从中得到的一点是函数与对象相似的概念,即新函数可以动

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

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


我完全迷路了,有人能解释一下作者在这里的意思吗?有什么相似之处?它们是如何比较的?

我相信作者的意思可能是,函数式编程允许函数与java中的对象具有相同的状态,即它们可以独立存在,而不属于类(与java中的方法不同)。

这个措辞似乎特别笨拙,我不完全确定它想说什么。但我从中得到的一点是函数与对象相似的概念,即新函数可以动态创建,函数可以包含状态。这是其他语言已经使用了一段时间的东西,但是在Java中它是如此的麻烦以至于在Java8引入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"));
Java代码更加冗长,主要是因为类型声明和类似
System.out.println
的东西。返回值实际上不是一个函数,它是一个函数接口的实例。但本质特征是相同的。一旦你习惯了,你就会开始像对待函数一样对待函数接口的实例

当然,在Java7或更早的版本中,使用匿名内部类而不是lambdas,这样做总是可能的,但是它太麻烦了,以至于几乎没有人想过这样做

foox
fooxy
barqq