为什么lambda返回相同的对象

为什么lambda返回相同的对象,lambda,java-8,Lambda,Java 8,几乎每一本介绍lambda的书都是从Runnableanonymous类开始的,甚至提到它是“anonymous类”的替代品。但是,lambda返回相同的对象,而匿名类返回一个新对象 1。为什么lambda会这样做? 2。为什么设计成这样? 呼叫站点的与您的情况相同,每个呼叫站点都会发生链接。我认为,为了更好地理解这一点,您需要了解什么是invokedynamic。您可以阅读更多。我认为原因可能是添加了使用lambda的链调用方法的可能性,如lambda2(lambda())。因为您不需要多个R

几乎每一本介绍lambda的书都是从
Runnable
anonymous类开始的,甚至提到它是“anonymous类”的替代品。但是,lambda返回相同的对象,而匿名类返回一个新对象

1。为什么lambda会这样做?

2。为什么设计成这样?


呼叫站点的
与您的情况相同,每个呼叫站点都会发生
链接。我认为,为了更好地理解这一点,您需要了解什么是
invokedynamic
。您可以阅读更多。

我认为原因可能是添加了使用lambda的链调用方法的可能性,如lambda2(lambda())。因为您不需要多个
Runnable
实例来执行完全相同的操作。然而,匿名内部类与
new
操作符连接,它保证生成一个新的独立实例,不管您是否需要它。Lambda表达式有机会创建更少的对象,这已在规范中明确声明。正如……中所解释的,避免分配是一件好事™, 因此,没有理由认为它应该以任何其他方式运行(尽管它可以)。不,普通开发人员不应该为了有效地使用lambdas而必须理解底层机制(可以自由更改!)。他们必须知道的是:lambda不能保证其身份的唯一性,句号是。@BrianGoetz然后那个普通的开发人员就变成了一个例外的笨蛋,因为他/她的意外情况可能随时随地发生。@Tiina也许我不清楚;我批评的是答案,而不是问题。常规开发人员应该理解的是,Java语言规范指出,lambda表达式不会对其身份做出任何承诺。
CallSite
invokedynamic
的细节仅仅是实现细节,只要实现符合规范,这些细节可能会改变。用户应该了解语言的用途,而不是编译器在某一天会做什么。