<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.1.3" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Reacties op: Fluent Interfaces</title>
	<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/</link>
	<description>Nederlandse blog over software ontwikkeling</description>
	<pubDate>Thu, 16 Oct 2008 00:22:06 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.3</generator>

	<item>
		<title>By: Erik van Oosten</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18192</link>
		<author>Erik van Oosten</author>
		<pubDate>Tue, 25 Mar 2008 19:43:00 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18192</guid>
					<description>Wauw, goed artikel!

Al aan gedacht om aan te sluiten bij FunctionalJ (http://functionalj.sourceforge.net)? Misschien handig voor het maken van functie objecten.</description>
		<content:encoded><![CDATA[<p>Wauw, goed artikel!</p>
<p>Al aan gedacht om aan te sluiten bij FunctionalJ (http://functionalj.sourceforge.net)? Misschien handig voor het maken van functie objecten.</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Felix</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18216</link>
		<author>Felix</author>
		<pubDate>Wed, 26 Mar 2008 20:02:09 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18216</guid>
					<description>Ik ben voorstander van deze aanpak, maar ik voorzie wel performance-piepers die zeggen dat je op deze manier meerdere keren door al je collecties loopt. Of zie ik dat verkeerd? Iemand anders kan namelijk in 1 SQL query (met meerdere "WHERE clauses") dit doen. Als er tenminste een SQL database achter hangt... Maar het geldt ook voor de wat ingewikkeldere for-loop.
 
Als ik het goed zie: is er dan ook een manier waarop je predicaten kunt "verzamelen" en dan uiteindelijk in 1 loop tegelijk toepassen? Dat zou namelijk meteen een performance-increase geven en ook de nay-sayers overtuigen...</description>
		<content:encoded><![CDATA[<p>Ik ben voorstander van deze aanpak, maar ik voorzie wel performance-piepers die zeggen dat je op deze manier meerdere keren door al je collecties loopt. Of zie ik dat verkeerd? Iemand anders kan namelijk in 1 SQL query (met meerdere &#8220;WHERE clauses&#8221;) dit doen. Als er tenminste een SQL database achter hangt&#8230; Maar het geldt ook voor de wat ingewikkeldere for-loop.</p>
<p>Als ik het goed zie: is er dan ook een manier waarop je predicaten kunt &#8220;verzamelen&#8221; en dan uiteindelijk in 1 loop tegelijk toepassen? Dat zou namelijk meteen een performance-increase geven en ook de nay-sayers overtuigen&#8230;</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Peter Maas</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18217</link>
		<author>Peter Maas</author>
		<pubDate>Wed, 26 Mar 2008 20:10:47 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18217</guid>
					<description>Felix je hebt gelijk, je zou predikaten ook kunnen opzamelen. Maar je kunt een predikaat zo ingewikkeld maken als je zelf wilt; dus als performance een issue is zou je ook meerdere checks kunnen combineren.

Ik was bezig aan een refactor slag waar bij je meerdere predikaten kunt combineren tot een enkel filter; maar door wat vervelende eigenschappen van generics (kun je eigenlijk niet gebruiken in var-args) was ik nog niet tot een mooie oplossing gekomen.

Overigens moet je dit ook zien als een voorbeeld voor het bouwen van fluent interfaces, niet per definitie als _de_ oplossing voor alle collectie 'problemen'.

Het voordeel van deze (of iedere aanpak die zorgt dat code DRY wordt) aanpak is trouwen dat dergelijke performance tweaks maar op één enkele plek plaats hoeven te vinden.</description>
		<content:encoded><![CDATA[<p>Felix je hebt gelijk, je zou predikaten ook kunnen opzamelen. Maar je kunt een predikaat zo ingewikkeld maken als je zelf wilt; dus als performance een issue is zou je ook meerdere checks kunnen combineren.</p>
<p>Ik was bezig aan een refactor slag waar bij je meerdere predikaten kunt combineren tot een enkel filter; maar door wat vervelende eigenschappen van generics (kun je eigenlijk niet gebruiken in var-args) was ik nog niet tot een mooie oplossing gekomen.</p>
<p>Overigens moet je dit ook zien als een voorbeeld voor het bouwen van fluent interfaces, niet per definitie als _de_ oplossing voor alle collectie &#8216;problemen&#8217;.</p>
<p>Het voordeel van deze (of iedere aanpak die zorgt dat code DRY wordt) aanpak is trouwen dat dergelijke performance tweaks maar op één enkele plek plaats hoeven te vinden.</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Edwin van der Elst</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18231</link>
		<author>Edwin van der Elst</author>
		<pubDate>Thu, 27 Mar 2008 09:28:37 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18231</guid>
					<description>De Criteria api zal verschillende predikaten combineren en er 1 SQL statement van maken.
Dus als je data uit een database komt, dan speelt het probleem van 'meerdere keren aflopen van de collecties' niet zo.
Ik zie een derrgelijke techniek niet als vervanging voor SQL/Hibernate, maar meer om collecties te filteren die op een andere manier zijn opgebouwd.</description>
		<content:encoded><![CDATA[<p>De Criteria api zal verschillende predikaten combineren en er 1 SQL statement van maken.<br />
Dus als je data uit een database komt, dan speelt het probleem van &#8216;meerdere keren aflopen van de collecties&#8217; niet zo.<br />
Ik zie een derrgelijke techniek niet als vervanging voor SQL/Hibernate, maar meer om collecties te filteren die op een andere manier zijn opgebouwd.</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Peter Maas</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18232</link>
		<author>Peter Maas</author>
		<pubDate>Thu, 27 Mar 2008 09:40:10 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18232</guid>
					<description>@edwin inderdaad, dit is ook precies het verschil tussen de verschillende manieren waarop een fluent interface zou kunnen worden geïmplementeerd.

&lt;blockquote&gt;
Bij het aanroepen van één van de resultaat functies (list, unique, scroll) wordt de uiteindelijk query opgebouwd en uitgevoerd
&lt;/blockquote&gt;</description>
		<content:encoded><![CDATA[<p>@edwin inderdaad, dit is ook precies het verschil tussen de verschillende manieren waarop een fluent interface zou kunnen worden geïmplementeerd.</p>
<blockquote><p>
Bij het aanroepen van één van de resultaat functies (list, unique, scroll) wordt de uiteindelijk query opgebouwd en uitgevoerd
</p></blockquote>
]]></content:encoded>
				</item>
	<item>
		<title>By: Auke van Leeuwen</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18266</link>
		<author>Auke van Leeuwen</author>
		<pubDate>Sat, 29 Mar 2008 11:48:53 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18266</guid>
					<description>... Ik was bezig aan een refactor slag waar bij je meerdere predikaten kunt combineren tot een enkel filter; maar door wat vervelende eigenschappen van generics (kun je eigenlijk niet gebruiken in var-args) was ik nog niet tot een mooie oplossing gekomen. ...

Nu snap ik waarom je zat te klagen over var-args en type safety etc. ;-) Het is inderdaad curieus dat je type safety warnings krijgt bij het maken van een getypede var-args parameter.
Maar in het kader van de Fluent-heid, kan je de BooleanPredicates toch ook chainen? 

new BooleanPredicate().and(new BooleanPredicate()).or(new BooleanPredicate())?

Een final evaluate() methode zou dan zorg dragen voor de uiteindelijke return waarde.</description>
		<content:encoded><![CDATA[<p>&#8230; Ik was bezig aan een refactor slag waar bij je meerdere predikaten kunt combineren tot een enkel filter; maar door wat vervelende eigenschappen van generics (kun je eigenlijk niet gebruiken in var-args) was ik nog niet tot een mooie oplossing gekomen. &#8230;</p>
<p>Nu snap ik waarom je zat te klagen over var-args en type safety etc. <img src='http://blog.finalist.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> Het is inderdaad curieus dat je type safety warnings krijgt bij het maken van een getypede var-args parameter.<br />
Maar in het kader van de Fluent-heid, kan je de BooleanPredicates toch ook chainen? </p>
<p>new BooleanPredicate().and(new BooleanPredicate()).or(new BooleanPredicate())?</p>
<p>Een final evaluate() methode zou dan zorg dragen voor de uiteindelijke return waarde.</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Peter Maas</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18267</link>
		<author>Peter Maas</author>
		<pubDate>Sat, 29 Mar 2008 12:29:54 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18267</guid>
					<description>De laatste 'evaluate' zou je niet eens nodig hebben als de 'and' call een nieuw predikaat geeft. 
 
Zelf zat ik ondertussen te denken een Filter klasse te introduceren die meerdere predikaten combineert:


public class Filter extends BooleanPredicate {
	public List&#62; predicates = new ArrayList&#62;();
	@Override
	public boolean eval(T t) {
		for(BooleanPredicate predicate : predicates){
			if(predicate.eval(t) == false){
				return false;
			}
		}
		return true;
	}

	public static  Filter with(BooleanPredicate firstPredicate){
		Filter filter = new Filter();
		return filter.and(firstPredicate);
	}
	
	public Filter and(BooleanPredicate predicate){
		predicates.add(predicate);
		return this;
	}
}


Dit zou je dan als volgt kunnen gebruiken:


public class FilterTest extends TestCase {
	public final List testData = Arrays.asList("appel", "aardappel", "peer", "sinaasappel");
	
	public void testFilterWithTwoPredicates(){
		Collection result = from(testData).all(with(contains("appel")).and(doesNotContain("sinaas"))).result();
		assertEquals(2, result.size());
	}
	
	private BooleanPredicate contains(final String word){
		return new BooleanPredicate() {
			@Override
			public boolean eval(final String t) {
				return t.indexOf(word) &#62; -1;
			}
		};
	}
	
	private BooleanPredicate doesNotContain(final String word){
		return new BooleanPredicate() {
			@Override
			public boolean eval(final String t) {
				return t.indexOf(word) == -1;
			}
		};
	}
}


Maar ik moet zeggen dat ik nog niet helemaal gelukkig ben met het enorme hoeveelheid haakjes in de aanroep.</description>
		<content:encoded><![CDATA[<p>De laatste &#8216;evaluate&#8217; zou je niet eens nodig hebben als de &#8216;and&#8217; call een nieuw predikaat geeft. </p>
<p>Zelf zat ik ondertussen te denken een Filter klasse te introduceren die meerdere predikaten combineert:</p>
<p>public class Filter extends BooleanPredicate {<br />
	public List&gt; predicates = new ArrayList&gt;();<br />
	@Override<br />
	public boolean eval(T t) {<br />
		for(BooleanPredicate predicate : predicates){<br />
			if(predicate.eval(t) == false){<br />
				return false;<br />
			}<br />
		}<br />
		return true;<br />
	}</p>
<p>	public static  Filter with(BooleanPredicate firstPredicate){<br />
		Filter filter = new Filter();<br />
		return filter.and(firstPredicate);<br />
	}</p>
<p>	public Filter and(BooleanPredicate predicate){<br />
		predicates.add(predicate);<br />
		return this;<br />
	}<br />
}</p>
<p>Dit zou je dan als volgt kunnen gebruiken:</p>
<p>public class FilterTest extends TestCase {<br />
	public final List testData = Arrays.asList(&#8221;appel&#8221;, &#8220;aardappel&#8221;, &#8220;peer&#8221;, &#8220;sinaasappel&#8221;);</p>
<p>	public void testFilterWithTwoPredicates(){<br />
		Collection result = from(testData).all(with(contains(&#8221;appel&#8221;)).and(doesNotContain(&#8221;sinaas&#8221;))).result();<br />
		assertEquals(2, result.size());<br />
	}</p>
<p>	private BooleanPredicate contains(final String word){<br />
		return new BooleanPredicate() {<br />
			@Override<br />
			public boolean eval(final String t) {<br />
				return t.indexOf(word) &gt; -1;<br />
			}<br />
		};<br />
	}</p>
<p>	private BooleanPredicate doesNotContain(final String word){<br />
		return new BooleanPredicate() {<br />
			@Override<br />
			public boolean eval(final String t) {<br />
				return t.indexOf(word) == -1;<br />
			}<br />
		};<br />
	}<br />
}</p>
<p>Maar ik moet zeggen dat ik nog niet helemaal gelukkig ben met het enorme hoeveelheid haakjes in de aanroep.</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Peter Maas</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18268</link>
		<author>Peter Maas</author>
		<pubDate>Sat, 29 Mar 2008 12:38:33 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18268</guid>
					<description>Bah, mijn code is gemangeld door wordpress..... en niet genoeg recht om het aan te passen... die generics dingen klopten wel hoor ;)</description>
		<content:encoded><![CDATA[<p>Bah, mijn code is gemangeld door wordpress&#8230;.. en niet genoeg recht om het aan te passen&#8230; die generics dingen klopten wel hoor <img src='http://blog.finalist.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Auke van Leeuwen</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18277</link>
		<author>Auke van Leeuwen</author>
		<pubDate>Sat, 29 Mar 2008 19:43:28 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18277</guid>
					<description>Tja, die haakjes ontkom je denk niet helemaal aan. Overigens begrijp ik niet helemaal waarom je een Filter zou introduceren als je het ook binnen het BooleanPredicate kan oplossen? Een Filter lijkt gelimiteerd tot een serie van ANDs. Ik ben een beetje huiverig om mijn code erin te plakken, but here goes&#160;nothing: &#60;test&#62;</description>
		<content:encoded><![CDATA[<p>Tja, die haakjes ontkom je denk niet helemaal aan. Overigens begrijp ik niet helemaal waarom je een Filter zou introduceren als je het ook binnen het BooleanPredicate kan oplossen? Een Filter lijkt gelimiteerd tot een serie van ANDs. Ik ben een beetje huiverig om mijn code erin te plakken, but here goes&nbsp;nothing: &lt;test&gt;</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Auke van Leeuwen</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18278</link>
		<author>Auke van Leeuwen</author>
		<pubDate>Sat, 29 Mar 2008 19:44:16 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18278</guid>
					<description>public&#160;abstract&#160;class&#160;BooleanPredicate&#60;T&#62;&#160;{

&#160;&#160;public&#160;final&#160;BooleanPredicate&#60;T&#62;&#160;and(final&#160;BooleanPredicate&#60;T&#62;&#160;other)&#160;{
&#160;&#160;&#160;&#160;if&#160;(other&#160;==&#160;null)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;throw&#160;new&#160;IllegalArgumentException(\&#34;other&#160;BooleanPredicate&#160;may&#160;not&#160;be&#160;null!\&#34;);
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;return&#160;new&#160;BooleanPredicate&#60;T&#62;()&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;@Override
&#160;&#160;&#160;&#160;&#160;&#160;public&#160;boolean&#160;eval(T&#160;t)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;BooleanPredicate.this.eval(t)&#160;&#038;&#038;&#160;other.eval(t);
&#160;&#160;&#160;&#160;&#160;&#160;};
&#160;&#160;&#160;&#160;};
&#160;&#160;}

&#160;&#160;public&#160;final&#160;BooleanPredicate&#60;T&#62;&#160;or(final&#160;BooleanPredicate&#60;T&#62;&#160;other)&#160;{
&#160;&#160;&#160;&#160;if&#160;(other&#160;==&#160;null)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;throw&#160;new&#160;IllegalArgumentException(\&#34;other&#160;BooleanPredicate&#160;may&#160;not&#160;be&#160;null!\&#34;);
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;return&#160;new&#160;BooleanPredicate&#60;T&#62;()&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;@Override
&#160;&#160;&#160;&#160;&#160;&#160;public&#160;boolean&#160;eval(T&#160;t)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;BooleanPredicate.this.eval(t)&#160;&#124;&#124;&#160;other.eval(t);
&#160;&#160;&#160;&#160;&#160;&#160;};
&#160;&#160;&#160;&#160;};
&#160;&#160;}

&#160;&#160;public&#160;final&#160;BooleanPredicate&#60;T&#62;&#160;not()&#160;{
&#160;&#160;&#160;&#160;return&#160;new&#160;BooleanPredicate&#60;T&#62;()&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;@Override
&#160;&#160;&#160;&#160;&#160;&#160;public&#160;boolean&#160;eval(T&#160;t)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;!BooleanPredicate.this.eval(t);
&#160;&#160;&#160;&#160;&#160;&#160;};
&#160;&#160;&#160;&#160;};
&#160;&#160;}

&#160;&#160;/**
&#160;&#160;&#160;*&#160;This&#160;method&#160;needs&#160;to&#160;be&#160;implemented.
&#160;&#160;&#160;*
&#160;&#160;&#160;*&#160;@param&#160;t
&#160;&#160;&#160;*&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;object&#160;to&#160;evaluate
&#160;&#160;&#160;*&#160;@return&#160;true&#160;or&#160;false,&#160;depending&#160;on&#160;your&#160;needs
&#160;&#160;&#160;*/
&#160;&#160;public&#160;abstract&#160;boolean&#160;eval(T&#160;t);
}</description>
		<content:encoded><![CDATA[<p>public&nbsp;abstract&nbsp;class&nbsp;BooleanPredicate&lt;T&gt;&nbsp;{</p>
<p>&nbsp;&nbsp;public&nbsp;final&nbsp;BooleanPredicate&lt;T&gt;&nbsp;and(final&nbsp;BooleanPredicate&lt;T&gt;&nbsp;other)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(other&nbsp;==&nbsp;null)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(\&quot;other&nbsp;BooleanPredicate&nbsp;may&nbsp;not&nbsp;be&nbsp;null!\&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BooleanPredicate&lt;T&gt;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;eval(T&nbsp;t)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;BooleanPredicate.this.eval(t)&nbsp;&#038;&&nbsp;other.eval(t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public&nbsp;final&nbsp;BooleanPredicate&lt;T&gt;&nbsp;or(final&nbsp;BooleanPredicate&lt;T&gt;&nbsp;other)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(other&nbsp;==&nbsp;null)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(\&quot;other&nbsp;BooleanPredicate&nbsp;may&nbsp;not&nbsp;be&nbsp;null!\&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BooleanPredicate&lt;T&gt;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;eval(T&nbsp;t)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;BooleanPredicate.this.eval(t)&nbsp;||&nbsp;other.eval(t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public&nbsp;final&nbsp;BooleanPredicate&lt;T&gt;&nbsp;not()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BooleanPredicate&lt;T&gt;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;eval(T&nbsp;t)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;!BooleanPredicate.this.eval(t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;needs&nbsp;to&nbsp;be&nbsp;implemented.<br />
&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;t<br />
&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;object&nbsp;to&nbsp;evaluate<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;true&nbsp;or&nbsp;false,&nbsp;depending&nbsp;on&nbsp;your&nbsp;needs<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public&nbsp;abstract&nbsp;boolean&nbsp;eval(T&nbsp;t);<br />
}</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Auke van Leeuwen</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18279</link>
		<author>Auke van Leeuwen</author>
		<pubDate>Sat, 29 Mar 2008 19:46:21 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18279</guid>
					<description>En (in jouw bovenstaande FilterTest):

public&#160;void&#160;testFilterWithTwoPredicates()&#160;{
&#160;&#160;&#160;&#160;Collection&#60;String&#62;&#160;result&#160;=&#160;from(testData).all(contains(\&#34;appel\&#34;).and(doesNotContain(\&#34;sinaas\&#34;))).result();
&#160;&#160;&#160;&#160;assertEquals(2,&#160;result.size());
&#160;&#160;}

&#160;&#160;public&#160;void&#160;testFilterWithThreePredicate()&#160;{
&#160;&#160;&#160;&#160;Collection&#60;String&#62;&#160;result&#160;=&#160;from(testData).all((contains(\&#34;appel\&#34;).and(doesNotContain(\&#34;sinaas\&#34;))).or(contains(\&#34;peer\&#34;))).result();
&#160;&#160;&#160;&#160;assertEquals(3,&#160;result.size());
&#160;&#160;}

&#160;&#160;public&#160;void&#160;testTautologyPredicate()&#160;{
&#160;&#160;&#160;&#160;BooleanPredicate&#60;String&#62;&#160;a&#160;=&#160;contains(\&#34;appel\&#34;);
&#160;&#160;&#160;&#160;BooleanPredicate&#60;String&#62;&#160;b&#160;=&#160;doesNotContain(\&#34;peer\&#34;);

&#160;&#160;&#160;&#160;BooleanPredicate&#60;String&#62;&#160;tautology&#160;=&#160;(a.and(b)).or(a.not()).or(b.not());

&#160;&#160;&#160;&#160;Collection&#60;String&#62;&#160;result&#160;=&#160;from(testData).all(tautology).result();

&#160;&#160;&#160;&#160;assertEquals(4,&#160;result.size());
&#160;&#160;}</description>
		<content:encoded><![CDATA[<p>En (in jouw bovenstaande FilterTest):</p>
<p>public&nbsp;void&nbsp;testFilterWithTwoPredicates()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;String&gt;&nbsp;result&nbsp;=&nbsp;from(testData).all(contains(\&quot;appel\&quot;).and(doesNotContain(\&quot;sinaas\&quot;))).result();<br />
&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(2,&nbsp;result.size());<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public&nbsp;void&nbsp;testFilterWithThreePredicate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;String&gt;&nbsp;result&nbsp;=&nbsp;from(testData).all((contains(\&quot;appel\&quot;).and(doesNotContain(\&quot;sinaas\&quot;))).or(contains(\&quot;peer\&quot;))).result();<br />
&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(3,&nbsp;result.size());<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public&nbsp;void&nbsp;testTautologyPredicate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;BooleanPredicate&lt;String&gt;&nbsp;a&nbsp;=&nbsp;contains(\&quot;appel\&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;BooleanPredicate&lt;String&gt;&nbsp;b&nbsp;=&nbsp;doesNotContain(\&quot;peer\&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;BooleanPredicate&lt;String&gt;&nbsp;tautology&nbsp;=&nbsp;(a.and(b)).or(a.not()).or(b.not());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;String&gt;&nbsp;result&nbsp;=&nbsp;from(testData).all(tautology).result();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(4,&nbsp;result.size());<br />
&nbsp;&nbsp;}</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Peter Maas</title>
		<link>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18280</link>
		<author>Peter Maas</author>
		<pubDate>Sat, 29 Mar 2008 20:11:52 +0000</pubDate>
		<guid>http://blog.finalist.com/2008/03/25/fluent-interfaces/#comment-18280</guid>
					<description>Leuke oplossing Auke! 

Toch zou ik er persoonlijk denk ik voor kiezen om een specifiek predicate ('MyFruitMatchingRule') te schrijven voor de logica die nodig is in de all methode... zodat je gewoon zoiets kan doen:

&lt;pre&gt;
from(testData).all(new MyFruitMatchingRule()).result();
&lt;/pre&gt;

Maar goed, we hadden het over voorbeelden natuurlijk ;)</description>
		<content:encoded><![CDATA[<p>Leuke oplossing Auke! </p>
<p>Toch zou ik er persoonlijk denk ik voor kiezen om een specifiek predicate (&#8217;MyFruitMatchingRule&#8217;) te schrijven voor de logica die nodig is in de all methode&#8230; zodat je gewoon zoiets kan doen:</p>
<pre>
from(testData).all(new MyFruitMatchingRule()).result();
</pre>
<p>Maar goed, we hadden het over voorbeelden natuurlijk <img src='http://blog.finalist.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
				</item>
</channel>
</rss>
