{"id":1639,"date":"2012-12-29T12:12:23","date_gmt":"2012-12-29T10:12:23","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1639"},"modified":"2012-12-29T12:12:23","modified_gmt":"2012-12-29T10:12:23","slug":"die-umgebung-der-lambda-ausdrcke-und-variablenzugriffe","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/12\/die-umgebung-der-lambda-ausdrcke-und-variablenzugriffe\/","title":{"rendered":"Die Umgebung der Lambda-Ausdr&uuml;cke und Variablenzugriffe"},"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>Lambda-Ausdr\u00fccke k\u00f6nnen problemlos auf Objektvariablen und Klassenvariablen lesend und schreiben zugreifen. Auch auf lokale Variablen und Parameter hat ein Lambda-Ausdruck Zugriff, jedoch gibt es eine Einschr\u00e4nkung: die Variable muss final sein. Dass sie final ist, muss nicht extra mit einem Modifizierer geschrieben werden, aber sie muss effektiv final (engl. effectively final) sein, das hei\u00dft, nach der Initialisierung nicht mehr beschrieben werden.<\/p>\n<p>Ein Beispiel. Der Benutzer soll \u00fcber eine Eingabe die M\u00f6glichkeit bekommen zu bestimmen, ob String-Vergleiche mit unserem trimmenden Comparator unabh\u00e4ngig der Gro\u00df-\/Kleinschreibung stattfinden sollen.<\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">public<\/span> <span class=\"kwrd\">class<\/span> CompareIgnoreCase {\n  <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">static<\/span> <span class=\"kwrd\">void<\/span> main( String[] args ) {\n    <span class=\"rem\">\/*final*\/<\/span> boolean compareIgnoreCase = <span class=\"kwrd\">new<\/span> Scanner( System.<span class=\"kwrd\">in<\/span> ).nextBoolean();\n    Comparator&lt;String&gt; c = (String s1, String s2) -&gt; {\n      <span class=\"kwrd\">return<\/span> compareIgnoreCase ? s1.trim().compareToIgnoreCase( s2.trim() ) :\n                                 s1.trim().compareTo( s2.trim() ); };\n     String[] words = { <span class=\"str\">&quot;M&quot;<\/span>, <span class=\"str\">&quot;\\nSkyfall&quot;<\/span>, <span class=\"str\">&quot; Q&quot;<\/span>, <span class=\"str\">&quot;\\t\\tAdele\\t&quot;<\/span> };\n     Arrays.sort( words, c );\n     System.<span class=\"kwrd\">out<\/span>.println( Arrays.toString( words ) );\n  }\n}<\/pre>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>Ob compareIgnoreCase von uns final gesetzt wird oder nicht ist egal, denn die Variable wird effektiv final verwendet. Nat\u00fcrlich kann es nicht schaden, final als Modifizierer immer davor zu setzen, um den Leser des Codes diese Tatsache bewusst zu machen.<\/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-1639","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\/1639","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=1639"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1639\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}