<?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: Closures in Java - een introductie</title>
	<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/</link>
	<description>Nederlandse blog over software ontwikkeling</description>
	<pubDate>Thu, 16 Oct 2008 00:37:10 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.3</generator>

	<item>
		<title>By: Peter Maas</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-12651</link>
		<author>Peter Maas</author>
		<pubDate>Wed, 07 Nov 2007 15:44:24 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-12651</guid>
					<description>Leuk!

Ik vind dat overigens dat juist het RAII voorbeeld de 'veel complexer geworden' Java-syntax rechtvaardigt; terwijl de syntax niet echt veel complexer wordt... ben benieuwd naar het vervolg!</description>
		<content:encoded><![CDATA[<p>Leuk!</p>
<p>Ik vind dat overigens dat juist het RAII voorbeeld de &#8216;veel complexer geworden&#8217; Java-syntax rechtvaardigt; terwijl de syntax niet echt veel complexer wordt&#8230; ben benieuwd naar het vervolg!</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Bram Doornbos</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-12838</link>
		<author>Bram Doornbos</author>
		<pubDate>Fri, 09 Nov 2007 14:36:48 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-12838</guid>
					<description>Gaaf artikel!
Sluit mij dan ook aan bij Peter Maas: "ben benieuwd naar het vervolg!"

Moest het wel even 2 keer lezen om het mijzelf eigen te maken.
Ik ga het binnenkort is uitproberen...</description>
		<content:encoded><![CDATA[<p>Gaaf artikel!<br />
Sluit mij dan ook aan bij Peter Maas: &#8220;ben benieuwd naar het vervolg!&#8221;</p>
<p>Moest het wel even 2 keer lezen om het mijzelf eigen te maken.<br />
Ik ga het binnenkort is uitproberen&#8230;</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: rikkert</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-13041</link>
		<author>rikkert</author>
		<pubDate>Mon, 12 Nov 2007 13:36:25 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-13041</guid>
					<description>Ey interessant, misschien eens aanvullen met closures in Javascript, da's ook een behoorlijk onbegrepen gebied.</description>
		<content:encoded><![CDATA[<p>Ey interessant, misschien eens aanvullen met closures in Javascript, da&#8217;s ook een behoorlijk onbegrepen gebied.</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: rmlinden</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14113</link>
		<author>rmlinden</author>
		<pubDate>Wed, 28 Nov 2007 10:35:44 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14113</guid>
					<description>Tja, leuk en aardig deze closures, maar het zal toch echt niet gaan werken in java

in jouw voorbeeld code is het probleem al te zien. 

private static  List map (List bronlijst, {X =&#62; Y} functie) {
        List doellijst = new ArrayList (bronlijst.size ());
 
Het probleem zit 'm in de new ArrayList. FP gaat om lazy evaluation en dat ondersteunt java niet doordat de zoals in .Net bekende Yield ontbreekt. Het komt erop neer dat de volledige lijst meteen greedy uitgerekend moet worden. En gezien elke FP functie met een lijst operatie een nieuwe lijst (of 1 enkel element) dient op te leveren betekent dat dus dat de orginele lijst niet aangepast mag worden. 
Zie de map bijvoorbeeld. Alle elementen van de argument lijst worden omgerekend en in een resultaat lijst gezet. Deze resultaatlijst moet gemaakt worden, in dit geval wordt dit dus een Arraylist. 

en dat is dus niet goed. 

stel we hebben een lijst representatie die intern als een tree is geimplementeerd, of er gelden ordeningen, filteringe and whatnot in ons EIGEN lijst implementatie. Vervolgens gooien we deze lijst als argument in de Map functie. het resultaat is dan een Arraylist.... er gaat een Type A in en er komt een Arraylist uit. Het interne gedrag van de lijst en diens eigenschappen gaan verloren door het aanroepen van de map methode. 
Het is ook verstandiger om niet List als argument te geven omdat alles wat een lijst vorm heeft (dus (x:xs) </description>
		<content:encoded><![CDATA[<p>Tja, leuk en aardig deze closures, maar het zal toch echt niet gaan werken in java</p>
<p>in jouw voorbeeld code is het probleem al te zien. </p>
<p>private static  List map (List bronlijst, {X =&gt; Y} functie) {<br />
        List doellijst = new ArrayList (bronlijst.size ());</p>
<p>Het probleem zit &#8216;m in de new ArrayList. FP gaat om lazy evaluation en dat ondersteunt java niet doordat de zoals in .Net bekende Yield ontbreekt. Het komt erop neer dat de volledige lijst meteen greedy uitgerekend moet worden. En gezien elke FP functie met een lijst operatie een nieuwe lijst (of 1 enkel element) dient op te leveren betekent dat dus dat de orginele lijst niet aangepast mag worden.<br />
Zie de map bijvoorbeeld. Alle elementen van de argument lijst worden omgerekend en in een resultaat lijst gezet. Deze resultaatlijst moet gemaakt worden, in dit geval wordt dit dus een Arraylist. </p>
<p>en dat is dus niet goed. </p>
<p>stel we hebben een lijst representatie die intern als een tree is geimplementeerd, of er gelden ordeningen, filteringe and whatnot in ons EIGEN lijst implementatie. Vervolgens gooien we deze lijst als argument in de Map functie. het resultaat is dan een Arraylist&#8230;. er gaat een Type A in en er komt een Arraylist uit. Het interne gedrag van de lijst en diens eigenschappen gaan verloren door het aanroepen van de map methode.<br />
Het is ook verstandiger om niet List als argument te geven omdat alles wat een lijst vorm heeft (dus (x:xs)</p>
]]></content:encoded>
				</item>
	<item>
		<title>By: rmlinden</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14114</link>
		<author>rmlinden</author>
		<pubDate>Wed, 28 Nov 2007 10:44:08 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14114</guid>
					<description>.... element op de kop van een lijst) als argument gegeven moet kunnen worden. Dus ook Set, Tree etc. 

alles wat dus itereerbaar. Enumerble of Iterable. het dient ook meteen voor arrays te werken. alles wat voldoet aan de eigenschap (x:xs). Hoe dan ook dient het return type hetzelde type te zijn als het argument type. 

Kernmerk van een closure is dat het een operatie is zonder side effects. het doet 1 ding en niet meer dan dat. En met het list type probleem is er dus een side effect, de closure is dus niet puur. 

Overigens zijn closures prima te maken in vrijwel elke object oriented taal. Het is enkel het "liften" van een operatie naar een class. In haskell kan je functies als argumenten aan een ander functie geven. In java kan dat niet. Je kan niet '+' of 'Math.abs(x)' meegeven aan een andere functie (behalve met reflectie). 

public interface Func{ 
  public O eval(I input); 
} 

public static Iterable map(Func&lt;I&gt; f, Iterable&lt;I&gt; xs){ 
   Iterable result = new ArrayList();  // </description>
		<content:encoded><![CDATA[<p>&#8230;. element op de kop van een lijst) als argument gegeven moet kunnen worden. Dus ook Set, Tree etc. </p>
<p>alles wat dus itereerbaar. Enumerble of Iterable. het dient ook meteen voor arrays te werken. alles wat voldoet aan de eigenschap (x:xs). Hoe dan ook dient het return type hetzelde type te zijn als het argument type. </p>
<p>Kernmerk van een closure is dat het een operatie is zonder side effects. het doet 1 ding en niet meer dan dat. En met het list type probleem is er dus een side effect, de closure is dus niet puur. </p>
<p>Overigens zijn closures prima te maken in vrijwel elke object oriented taal. Het is enkel het &#8220;liften&#8221; van een operatie naar een class. In haskell kan je functies als argumenten aan een ander functie geven. In java kan dat niet. Je kan niet &#8216;+&#8217; of &#8216;Math.abs(x)&#8217; meegeven aan een andere functie (behalve met reflectie). </p>
<p>public interface Func{<br />
  public O eval(I input);<br />
} </p>
<p>public static Iterable map(Func<i> f, Iterable</i><i> xs){<br />
   Iterable result = new ArrayList();  //</i></p>
]]></content:encoded>
				</item>
	<item>
		<title>By: rmlinden</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14116</link>
		<author>rmlinden</author>
		<pubDate>Wed, 28 Nov 2007 10:50:45 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14116</guid>
					<description>... zucht .. leve max input length 

public interface Func{ 
  public O eval(I input); 
} 

public static Iterable map(Func&lt;I&gt; f, Iterable&lt;I&gt; xs){ 
   Iterable result = new ArrayList();  //  filter(Func&lt;I&gt; f, Iterable&lt;I&gt; xs){ 
   Iterable&lt;I&gt; result = new ArrayList&lt;I&gt;(); //  even = new Func(){ 
   public Boolean eval(Integer input){ 
     return input % 2 == 0; 
   }
} 

List result = map(even, Arrays.asList(1... 100);</description>
		<content:encoded><![CDATA[<p>&#8230; zucht .. leve max input length </p>
<p>public interface Func{<br />
  public O eval(I input);<br />
} </p>
<p>public static Iterable map(Func<i> f, Iterable</i><i> xs){<br />
   Iterable result = new ArrayList();  //  filter(Func</i><i> f, Iterable</i><i> xs){<br />
   Iterable</i><i> result = new ArrayList</i><i>(); //  even = new Func(){<br />
   public Boolean eval(Integer input){<br />
     return input % 2 == 0;<br />
   }<br />
} </p>
<p>List result = map(even, Arrays.asList(1&#8230; 100);</i></p>
]]></content:encoded>
				</item>
	<item>
		<title>By: Levi Hoogenberg</title>
		<link>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14318</link>
		<author>Levi Hoogenberg</author>
		<pubDate>Sat, 01 Dec 2007 16:15:58 +0000</pubDate>
		<guid>http://blog.finalist.com/2007/11/07/closures-in-java-een-introductie/#comment-14318</guid>
					<description>De voorbeelden waren puur en alleen om het concept te illustreren. In plaats van een ArrayList zou er ook een LazyList (Commons Collections/eigen implementatie) teruggegeven kunnen worden.

Ik ben het niet met je eens dat een closure geen neveneffecten zou mogen hebben - soms is het juist de bedoeling om een lokale variabele van waarde te doen veranderen. Dit gaat ook ondersteund worden in de BGGA-implementatie (maar werkte nog niet toen ik dit artikel schreef).

Het is waar dat het eenvoudig is functors te schrijven (zie bijvoorbeeld Commons Functor of FunctionalJ), maar dat wil nog niet zeggen dat een taaluitbreiding met dit doel overbodig is. Maar meer daarover in het vervolgartikel.</description>
		<content:encoded><![CDATA[<p>De voorbeelden waren puur en alleen om het concept te illustreren. In plaats van een ArrayList zou er ook een LazyList (Commons Collections/eigen implementatie) teruggegeven kunnen worden.</p>
<p>Ik ben het niet met je eens dat een closure geen neveneffecten zou mogen hebben - soms is het juist de bedoeling om een lokale variabele van waarde te doen veranderen. Dit gaat ook ondersteund worden in de BGGA-implementatie (maar werkte nog niet toen ik dit artikel schreef).</p>
<p>Het is waar dat het eenvoudig is functors te schrijven (zie bijvoorbeeld Commons Functor of FunctionalJ), maar dat wil nog niet zeggen dat een taaluitbreiding met dit doel overbodig is. Maar meer daarover in het vervolgartikel.</p>
]]></content:encoded>
				</item>
</channel>
</rss>
