{"id":1902,"date":"2013-05-30T12:44:05","date_gmt":"2013-05-30T10:44:05","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1902"},"modified":"2013-05-30T12:44:05","modified_gmt":"2013-05-30T10:44:05","slug":"blcke-mit-code-und-die-funktionale-schnittstelle-java-util-function-consumer","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/05\/blcke-mit-code-und-die-funktionale-schnittstelle-java-util-function-consumer\/","title":{"rendered":"Bl&ouml;cke mit Code und die funktionale Schnittstelle java.util.function.Consumer"},"content":{"rendered":"<p>Anweisungen von Code lassen sich in eine Methode eines Objekts setzen und auf diese Weise weitergeben. Das ist eine h\u00e4ufige Notwendigkeit, f\u00fcr die das Paket java.util.function eine einfache funktionale Schnittstelle Consumer vorgibt:<\/p>\n<p>interface java.util.function.<b>Consumer<\/b>&lt;T&gt;<\/p>\n<p>*&#160; void accept(T t). F\u00fchrt Operationen mit der \u00dcbergabe t durch.<\/p>\n<p>Die accept(\u2026)-Methode bekommt ein Argument \u2013 wobei die Implementierung nat\u00fcrlich nicht zwingend darauf zur\u00fcckgreifen muss \u2013 und liefert keine R\u00fcckgabe. Transformationen sind damit nicht m\u00f6glich, denn nur \u00fcber Umwege kann der Konsument die Ergebnisse speichern, und daf\u00fcr ist die Schnittstelle nicht gedacht. Consumer-Typen sind eher gedacht als Endglied einer Kette, in der zum Beispiel Dateien in eine Datei geschrieben werden, die vorher verarbeitet wurden.<\/p>\n<p>Immer repr\u00e4sentieren Konsumenten Code, und eine API kann nun einfach einen Code-Block nach der Art doSomethingWith(myConsumer) annehmen, und ihn etwa in einem Hintergrund-Thread abzuarbeiten, wiederholend auszuf\u00fchren, nach einer erlaubten Maximaldauer abbrechen, die Zeit messen, \u2026<\/p>\n<p><strong>Beispiel<\/strong><\/p>\n<p>Implementiere einen Consumer-Wrapper, der die Ausf\u00fchrungszeit eines anderen Konsumenten loggt.<\/p>\n<p>import java.util.function.*;<\/p>\n<p>import java.util.logging.Logger;<\/p>\n<p>class Consumers {<\/p>\n<p>public static &lt;T&gt; Consumer&lt;T&gt; measuringConsumer( Consumer&lt;T&gt; block ) {<\/p>\n<p>return t -&gt; {<\/p>\n<p>long start = System.nanoTime();<\/p>\n<p>block.accept( t );<\/p>\n<p>long duration = System.nanoTime() &#8211; start;<\/p>\n<p>Logger.getAnonymousLogger().info( &quot;Ausf\u00fchrungszeit (ms): &quot; + duration );<\/p>\n<p>};<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>Folgender Aufruf zeigt die Nutzung:<\/p>\n<p>Consumer&lt;Void&gt; wrap = measuringConsumer( (Void) -&gt; System.out.println( &quot;Test&quot; ) );<\/p>\n<p>wrap.accept( null );<\/p>\n<p><strong>Typ Consumer in der API<\/strong><\/p>\n<p>In der Java-API zeigt sich der Typ Consumer in der Regel als Argument einer Methode forEach(Consumer), die Datenquellen abl\u00e4uft und f\u00fcr jedes Element accept(\u2026) aufruft. Interessant ist die Methode an dem Typ Iterable, denn die wichtigen Collection-Datenstrukturen wie ArrayList implementieren diese Schnittstelle.<\/p>\n<p><strong>Beispiel<\/strong><\/p>\n<p>Gib jedes Element einer Liste auf der Konsole aus:<\/p>\n<p>Arrays.asList(1, 2, 3, 4).forEach( t -&gt; System.out.println( t ) );<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anweisungen von Code lassen sich in eine Methode eines Objekts setzen und auf diese Weise weitergeben. Das ist eine h\u00e4ufige Notwendigkeit, f\u00fcr die das Paket java.util.function eine einfache funktionale Schnittstelle Consumer vorgibt: interface java.util.function.Consumer&lt;T&gt; *&#160; void accept(T t). F\u00fchrt Operationen mit der \u00dcbergabe t durch. Die accept(\u2026)-Methode bekommt ein Argument \u2013 wobei die Implementierung nat\u00fcrlich [&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-1902","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\/1902","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=1902"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1902\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}