{"id":2740,"date":"2014-03-23T11:59:06","date_gmt":"2014-03-23T09:59:06","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2740"},"modified":"2014-03-23T11:59:06","modified_gmt":"2014-03-23T09:59:06","slug":"java-8-abstrakten-methode-als-funktionale-schnittstelle-lambda-ausdruck","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2014\/03\/java-8-abstrakten-methode-als-funktionale-schnittstelle-lambda-ausdruck\/","title":{"rendered":"Klassen mit einer abstrakten Methode als funktionale Schnittstelle?"},"content":{"rendered":"<p>Als die Entwickler der Sprache Java die Lambda-Ausdr\u00fccke diskutierten, stand auch die Frage im Raum, ob abstrakte Klassen, die nur \u00fcber eine abstrakte Methode verf\u00fcgen, ebenfalls f\u00fcr Lambda-Ausdr\u00fccke genutzt werden k\u00f6nnen.<a title=\"\" href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Eigene%20Dokumente\/Insel\/todo\/1.Lambdas,%20JPB,%20ISP,%20JM,%20zu%20MS.doc#_ftn1\">[1]<\/a> Sie entschieden sich dagegen, unter anderem deswegen, weil bei der Implementierung von Schnittstellen die JVM weitreichende Optimierungen vornehmen kann. Und bei Klassen wird das schwierig. Das liegt auch daran, dass ein Konstruktor umfangreiche Initialisierungen mit Seiteneffekten vornimmt (die Konstruktoren aller Oberklassen nicht zu vergessen), sowie Ausnahmen ausl\u00f6sen k\u00f6nnte. Gew\u00fcnscht ist aber nur die Ausf\u00fchrung einer Implementierung der funktionalen Schnittstelle und kein anderer Code.<\/p>\n<p>Es gibt nun im JDK einige abstrakte Klassen, die genau eine abstrakte Methode vorschreiben, etwa java.util.TimerTask. Solche Klassen k\u00f6nnen nicht \u00fcber einen Lambda-Ausdruck realisiert werden; hier m\u00fcssen Entwickler weiterhin zu Klassenimplementierungen greifen, und die k\u00fcrzeste L\u00f6sung ist eine innere anonyme Klasse. Eigene Hilfsklassen k\u00f6nnen nat\u00fcrlich den Code etwas abk\u00fcrzen, aber eben nur mit Hilfe einer eigenen Implementierung.<\/p>\n<p>Wer abstrakte Methoden mit Lambda-Ausdr\u00fccken implementieren m\u00f6chte, kann mit Hilfsklassen arbeiten. Denn wenn eine Hilfsklasse funktionale Schnittstellen einsetzt, so k\u00f6nnen Lambda-Ausdr\u00fccke wieder ins Spiel kommen, in dem die Implementierung der abstrakten Methode an den Lambda-Ausdruck weiterleitet. Nehmen wir das Beispiel f\u00fcr TimerTask und gehen zwei unterschiedliche Strategien der Implementierung durch. Mit Delegation sieht das so aus:<\/p>\n<pre>import java.util.*;\r\n\r\nclass TimerTaskLambda {\r\n\r\n\u00a0 public static TimerTask createTimerTask( <b>Runnable<\/b> <b>runnable<\/b> ) {\r\n\u00a0\u00a0\u00a0 return new TimerTask() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @Override public<b> void run() { runnable.run(); }\r\n<\/b>\u00a0\u00a0\u00a0 };\r\n\u00a0 }\r\n\u00a0\r\n\u00a0 public static void main( String[] args ) {\r\n\u00a0\u00a0\u00a0 new Timer().schedule( <b>createTimerTask( () -&gt; System.out.println(\"Hi\") )<\/b>, 500 );\r\n\u00a0 }\r\n}<\/pre>\n<p>Mit Vererbung erhalten wir:<\/p>\n<pre>public class LambdaTimerTask <b>extends TimerTask<\/b> {\r\n<span style=\"font-size: 14px;\">\u00a0 private final Runnable runnable;\r\n<\/span>\u00a0\u00a0\u00a0 public LambdaTimerTask( Runnable runnable ) {\r\n\u00a0\u00a0\u00a0 this.runnable = runnable;\r\n\u00a0 }\r\n\u00a0\u00a0\u00a0\r\n\u00a0 @Override public <b>void run() { runnable.run();\u00a0}\r\n<\/b>}<\/pre>\n<p>Der Aufruf erfolgt dann statt createTimerTask(\u2026) mit dem Konstruktor:<\/p>\n<pre>new Timer().schedule( <b>new LambdaTimerTask( () -&gt; System.out.println(\"Hi\") )<\/b>, 500 );<\/pre>\n<div>\n<hr align=\"left\" size=\"1\" width=\"33%\" \/>\n<div>\n<p><a title=\"\" href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Eigene%20Dokumente\/Insel\/todo\/1.Lambdas,%20JPB,%20ISP,%20JM,%20zu%20MS.doc#_ftnref1\">[1]<\/a>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Fr\u00fcher wurde hier die Abk\u00fcrzung SAM (Single Abstract Method)\u00a0genutzt.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Als die Entwickler der Sprache Java die Lambda-Ausdr\u00fccke diskutierten, stand auch die Frage im Raum, ob abstrakte Klassen, die nur \u00fcber eine abstrakte Methode verf\u00fcgen, ebenfalls f\u00fcr Lambda-Ausdr\u00fccke genutzt werden k\u00f6nnen.[1] Sie entschieden sich dagegen, unter anderem deswegen, weil bei der Implementierung von Schnittstellen die JVM weitreichende Optimierungen vornehmen kann. Und bei Klassen wird das [&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-2740","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\/2740","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=2740"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2740\/revisions"}],"predecessor-version":[{"id":2741,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2740\/revisions\/2741"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2740"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2740"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}