{"id":1684,"date":"2013-02-02T10:22:01","date_gmt":"2013-02-02T08:22:01","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1684"},"modified":"2013-02-02T10:39:57","modified_gmt":"2013-02-02T08:39:57","slug":"die-umgebung-der-lambda-ausdrcke","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/02\/die-umgebung-der-lambda-ausdrcke\/","title":{"rendered":"Die Umgebung der Lambda-Ausdr&uuml;cke"},"content":{"rendered":"<p>Ein Lambda-Ausdruck \u201esieht\u201c seine Umgebung genauso wie der Code, der vor oder nach dem Lambda-Ausdruck steht. Insbesondere hat ein Lambda-Ausdruck vollst\u00e4ndigen Zugriff auf alle Eigenschaften der Klasse, genauso wie auch der einschlie\u00dfende \u00e4u\u00dfere Block sie hat. Es gibt keinen besonderen Namensraum (nur neue und vielleicht \u00fcberdeckte Variablen durch die Parameter), und das ist einer der grundlegenden Unterschiede zwischen Lambda-Ausdr\u00fccken und inneren Klassen, bei denen this und super eine etwas andere Bedeutung haben.<\/p>\n<p>Namensr\u00e4ume<\/p>\n<p>Deklariert eine innere anonyme Klasse in der Methode Variablen, so ist der Satz immer \u201eneu\u201c, beziehungsweise die neuen Variablen \u00fcberschatten vorhandene lokale Variablen aus dem \u00e4u\u00dferen Kontext. Die Variable compareIgnoreCase kann im Rumpf von compare(\u2026) zum Beispiel problemlos neu deklariert werden:<\/p>\n<p>boolean <b>compareIgnoreCase<\/b> = true;<\/p>\n<p>Comparator&lt;String&gt; c = new Comparator&lt;String&gt;() {<\/p>\n<p>@Override public int compare( String s1, String s2 ) {<\/p>\n<p>boolean <b>compareIgnoreCase<\/b> = false; \/\/ v\u00f6llig ok<\/p>\n<p>return \u2026 <\/p>\n<p>}<\/p>\n<p>};<\/p>\n<p>In einem Lambda-Ausdruck ist das nicht m\u00f6glich und folgendes f\u00fchrt zu einer Compilermeldung \u201evariable compareIgnoreCase ist already defined\u201c.<\/p>\n<p>boolean <b>compareIgnoreCase<\/b> = true;<\/p>\n<p>Comparator&lt;String&gt; c = (s1, s2) -&gt; {<\/p>\n<p>boolean <b>compareIgnoreCase<\/b> = false; \/\/ Compilerfehler<\/p>\n<p>return \u2026<\/p>\n<p>}<\/p>\n<p>this-Referenz<\/p>\n<p>Lambda-Ausdr\u00fccke unterscheiden sich von inneren (anonymen) Klassen auch in dem, worauf die this-Referenz verweist: Bei Lambda-Ausdr\u00fccke zeigt this auf das Objekt, in dem der Lambda-Ausdruck eingebettet ist, bei inneren Klassen referenziert this die inneren Klasse.<\/p>\n<p>class Application {<\/p>\n<p>Application() {<\/p>\n<p>Runnable run1 = () -&gt; { System.out.println( <b>this<\/b>.getClass().getName() ); };<\/p>\n<p>Runnable run2 = new Runnable() {<\/p>\n<p>@Override public void run() { System.out.println( <b>this<\/b>.getClass().getName()); } };<\/p>\n<p>run1.run(); \/\/ app.Application<\/p>\n<p>run2.run(); \/\/ app.Application$1<\/p>\n<p>}<\/p>\n<p>public static void main( String[] args ) {<\/p>\n<p>new Application();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>Das Programm nutzt this einmal im Lambda-Ausdruck und einmal in der inneren Klasse. Im Fall vom Lambda-Ausdruck bezieht sich ausdr\u00fccklich auf das Application-Exemplar, was sich im Klassenamen niederschl\u00e4gt. Bei der inneren Klasse bekommen wir den Anhang $1, weil es sich um ein anderes Exemplar handelt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Lambda-Ausdruck \u201esieht\u201c seine Umgebung genauso wie der Code, der vor oder nach dem Lambda-Ausdruck steht. Insbesondere hat ein Lambda-Ausdruck vollst\u00e4ndigen Zugriff auf alle Eigenschaften der Klasse, genauso wie auch der einschlie\u00dfende \u00e4u\u00dfere Block sie hat. Es gibt keinen besonderen Namensraum (nur neue und vielleicht \u00fcberdeckte Variablen durch die Parameter), und das ist einer der [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,66],"tags":[],"class_list":["post-1684","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1684"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1684\/revisions"}],"predecessor-version":[{"id":1685,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1684\/revisions\/1685"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}