2017-09-29 2 views
4

Fast jedes Buch Einführung Lambda mit einer Runnable anonymen Klasse beginnen, oder sogar als Alternative zu "anonyme Klasse" erwähnt. Lambda gibt jedoch das gleiche Objekt zurück, während die anonyme Klasse eine neue zurückgibt.Warum Lambda gibt identische Objekt

1. Warum Lambda verhält sich so?

2. Warum ist es so konzipiert?

example codes and results

+0

Ich denke, der Grund könnte sein, die Möglichkeit hinzuzufügen, Methoden mit Lambda, wie lambda2 (lambda()) zu ketten. –

+3

Weil Sie nicht mehrere Instanzen von 'Runnable' benötigen, die genau dasselbe tun. Die anonyme innere Klasse ist jedoch mit dem "neuen" Operator verbunden, der garantiert, dass eine neue eindeutige Instanz erzeugt wird, unabhängig davon, ob Sie sie benötigen oder nicht. Lambda-Ausdrücke wurden geöffnet, um weniger Objekte zu erstellen, was explizit in der Spezifikation deklariert wurde. Wie in [Erzeugt ein Lambda-Ausdruck jedes Mal, wenn er ausgeführt wird, ein Objekt auf dem Heap erstellen?] (Https://stackoverflow.com/q/27524445/2711488) ... – Holger

+2

Das Vermeiden von Allokationen ist ein gutes Ding ™, also gibt es keinen Grund, warum es sollte sich anders verhalten (obwohl es könnte). – the8472

Antwort

1

Die CallSite ist das gleiche in Ihrem Fall, und linkage geschieht pro Anruf Ort. Ich denke, um das besser zu verstehen, müssen Sie sich ansehen, was invokedynamic ist. Sie können mehr lesen here.

+3

Nein, normale Entwickler sollten die Low-level-Mechanik (die frei zu ändern ist!) Nicht verstehen müssen, um lambdas effektiv zu verwenden. Was sie wissen müssen ist: lambdas kommen ohne Garantie für die Einzigartigkeit ihrer Identität, Punkt. –

+0

@BrianGoetz dann das * normale Entwickler * wird eine * Ausnahme bogglehead *, weil seine/ihre unerwartete Situation jederzeit überall auftreten kann. – Tiina

+0

@Tiina Vielleicht war ich nicht klar; Was ich kritisierte, war die Antwort, nicht die Frage. Was reguläre Entwickler verstehen sollten, ist, dass die _Java Language Specification_ besagt, dass Lambda-Ausdrücke sich nicht zu ihrer Identität verpflichten. Die Details von "CallSite" und "invokedynamic" sind lediglich Implementierungsdetails, die sich ändern können, solange die Implementierung der Spezifikation entspricht. Benutzer sollten verstehen, wofür die _language Commit_ ist und nicht, was der _Compiler an einem bestimmten Tag macht._ –

Verwandte Themen