{"id":1900,"date":"2013-05-28T15:01:06","date_gmt":"2013-05-28T13:01:06","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1900"},"modified":"2013-05-28T15:01:06","modified_gmt":"2013-05-28T13:01:06","slug":"prdikate-und-java-util-function-predicate","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/05\/prdikate-und-java-util-function-predicate\/","title":{"rendered":"Pr&auml;dikate und java.util.function.Predicate"},"content":{"rendered":"<p>Ein Pr\u00e4dikat ist eine Aussage \u00fcber einen Gegenstand, die wahr oder falsch. Die Frage mit Character.isDigit(&#8218;a&#8216;), ob das Zeichen \u201ea\u201c eine Ziffer ist, wird mit falsch beantwortet \u2013 isDigit ist also ein Pr\u00e4dikat, weil es \u00fcber einen Gegenstand, einem Zeichen, eine Wahrheitsaussage f\u00e4llen kann.<\/p>\n<p>Flexibler sind Pr\u00e4dikate, wenn sie als Objekte repr\u00e4sentiert werden, weil sie dann an unterschiedliche Stellen weitergegeben werden k\u00f6nnen, wenn etwa \u00fcber ein Pr\u00e4dikat bestimmt, was aus einer Sammlung gel\u00f6scht werden soll oder ob mindestens ein Element in einer Sammlung ist, was ein Pr\u00e4dikat erf\u00fcllt.<\/p>\n<p>Das java.util.function-Paket deklariert eine flexible funktionale Schnittstelle Predicate auf folgende Weise:<\/p>\n<p>interface java.util.function.<b>Predicate<\/b>&lt;T&gt;<\/p>\n<p>* boolean test(T t)   <br \/>&#160;&#160; F\u00fchrt einen Test auf t durch und liefert true, wenn das Kriterium erf\u00fcllt ist.<\/p>\n<p><strong>Beispiel<\/strong><\/p>\n<p>Der Test, ob ein Zeichen eine Ziffer ist, kann durch Pr\u00e4dikat-Objekte nun auch anders durchgef\u00fchrt werden:<\/p>\n<p><b>Predicate&lt;<\/b><b>Character<\/b><b>&gt; isDigit<\/b> = (Character c) -&gt; Character.isDigit( c );<\/p>\n<p>System.out.println( <b>isDigit.test(&#8218;a&#8216;)<\/b> ); \/\/ false<\/p>\n<p>H\u00e4tte es die Schnittstelle Predicate schon fr\u00fcher in Java 1.0 gegeben, h\u00e4tte es einer der Methode Character.isDigit(\u2026) gar nicht bedurft, es h\u00e4tte auch ein Predicate als statische Variable in Character geben k\u00f6nnen, so dass ein Test dann geschrieben w\u00fcrde als Character.IS_DIGIT.test(\u2026) oder als R\u00fcckgabe von einer Methode isDigit(), mit der Nutzung Character.isDigit().test(\u2026). Es ist daher gut m\u00f6glich, dass sich in Zukunft die API dahingehend ver\u00e4ndert, dass Aussagen auf Gegenst\u00e4nden mit Wahrheitsr\u00fcckgabe nicht mehr als Methoden bei den Klassen realisiert werden, sondern als Pr\u00e4dikat-Objekte angeboten werden. Aber Methoden-Referenzen geben zum Gl\u00fcck die Flexibilit\u00e4t, dass problemlos Methoden als Lambda-Ausdr\u00fccke gen\u00fctzt werden k\u00f6nnen und so kommen wir wieder von Methoden zu Funktionen.<\/p>\n<p><strong>Typ Predicate in der API<\/strong><\/p>\n<p>Es gibt in der Java-API vier Stellen, an denen Prediate-Objekte genutzt werden:<\/p>\n<p>\u00b7 Als Argument f\u00fcr L\u00f6sch-Methoden, um in Sammlungen Elemente zu spezifizieren, die gel\u00f6scht werden sollen.<\/p>\n<p>\u00b7 Bei den Default-Methoden der Predicate-Schnittstelle selbst, um Pr\u00e4dikate zu verkn\u00fcpfen.<\/p>\n<p>\u00b7 Bei regul\u00e4ren Ausdr\u00fccken, um ein Pattern als Predicate nutzen zu k\u00f6nnen.<\/p>\n<p>\u00b7 In der Stream-API, bei der Objekte beim Durchlaufen des Stroms \u00fcber ein Pr\u00e4dikat identifiziert werden, um sie etwa auszufiltern.<\/p>\n<p><strong>Beispiel<\/strong><\/p>\n<p>L\u00f6sche aus einer Liste mit Zeichen alle die, die Ziffern sind (es bleiben nur Zeichen \u00fcbrig, etwa Buchstaben).<\/p>\n<p>Predicate&lt;Character&gt; isDigit = (Character c) -&gt; Character.isDigit( c );<\/p>\n<p>List&lt;Character&gt; list = new ArrayList( Arrays.asList( &#8218;a&#8216;, &#8218;1&#8216; ) );<\/p>\n<p>list.<b>removeIf( isDigit )<\/b>;<\/p>\n<p><strong>Default-Methoden von Predicate<\/strong><\/p>\n<p>Es gibt eine Reihe von Default-Methoden, die die funktionale Schnittstelle Predicate anbietet. Zusammenfassend:<\/p>\n<p>interface java.util.function.<b>Predicate<\/b>&lt;T&gt;<\/p>\n<p>default Predicate&lt;T&gt; negate()<\/p>\n<p>default Predicate&lt;T&gt; and(Predicate&lt;? super T&gt; p)<\/p>\n<p>default Predicate&lt;T&gt; or(Predicate&lt;? super T&gt; p)<\/p>\n<p>default Predicate&lt;T&gt; xor(Predicate&lt;? super T&gt; p)<\/p>\n<p>Die Methodennamen sprechen f\u00fcr sich.<\/p>\n<p><strong>Beispiel<\/strong><\/p>\n<p>L\u00f6sche aus einer Liste mit Zeichen alle die, die <i>keine<\/i> Ziffern sind.<\/p>\n<p>Predicate&lt;Character&gt; isDigit = (Character c) -&gt; Character.isDigit( c );<\/p>\n<p>Predicate&lt;Character&gt; isNotDigit = isDigit.negate();<\/p>\n<p>List&lt;Character&gt; list = new ArrayList( Arrays.asList( &#8218;a&#8216;, &#8218;1&#8216; ) );<\/p>\n<p>list.<b>removeIf( isNotDigit )<\/b>;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Pr\u00e4dikat ist eine Aussage \u00fcber einen Gegenstand, die wahr oder falsch. Die Frage mit Character.isDigit(&#8218;a&#8216;), ob das Zeichen \u201ea\u201c eine Ziffer ist, wird mit falsch beantwortet \u2013 isDigit ist also ein Pr\u00e4dikat, weil es \u00fcber einen Gegenstand, einem Zeichen, eine Wahrheitsaussage f\u00e4llen kann. Flexibler sind Pr\u00e4dikate, wenn sie als Objekte repr\u00e4sentiert werden, weil sie [&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-1900","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\/1900","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=1900"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1900\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}