gafter bejegyzései

2010. febr. 3. 8:05 - írta akos.tajti

a JDK7 újdonságai között hosszú huzavona után végül ott lesznek a lambda kifejezések. azt még senki nem tudja, milyen formában és milyen mélységben, de bekerülnek a nyelvbe. a vitákról és a különböző specifikációkról rengeteg anyagot találhattok, mivel az utóbbi időben minden nagy javás arc ezzel a témával foglalkozott. kezdésnek talán neal gafter blogján érdemes végigfutni. valószínűleg amit ő leír nincs túl távol attól, ami végül a nyelvben megjelenik.

addig is amíg ez az újítás nem jelenik meg, kereshetünk olyan megoldásokat, amik nagyon emlékeztetnek a lambda kifejezésekre. itt van például ez:

thread = java.lang.Thread(
	function() { 
		print(java.lang.Thread.currentThread().getName());
	} 
);
thread.start();

hogy mi is ez? pontosan az, amit a legtöbb java programozó lambda kifejezés néven a nyelvben látni szeretne. itt egy függvényt adunk át a Thread konstruktorának, ami tudja, hogy ezt hívja meg a run() metódus helyett (ez egyébként nem teljesen így van, de szép gondolat).

sajnos azonban erre  még várnunk kell: a fenti kód ugyanis egy javascript részlet. a tegnapelőtt postban írtam a rhinoról, a java scripting api egy javascript script engine implementációjáról. akkor elmondtam, hogy a rhinoban használhatunk java objektumokat, kihagytam viszont egy érdekes dolgot. abban az esetben, ha egy olyan interfészt kellene implementálnunk, amiben csak egy metódus van, a rhino megengedi, hogy csak a függvényimplementációt adjuk át. ebből ő majd előállítja a megfelelő interfész implementációt, de arról nekünk nem kell tudnunk. (a single abstract method (SAM) osztályok fogalma egyébként a java lambda kifejezés implementációja kapcsán is felmerült).

a fenti példában tehát előáll egy olyan Runnable implementáció. ha mégis magunknak akarjuk implementálni az interfészt, akkor azt így tehetjük meg:

var o = { run: function() { 
					print(java.lang.Thread.currentThread().getName());
				}
};
var r = new java.lang.Runnable(o);

még több érdekességet találhattok a rhino és a java kapcsolatáról a rhino dokumentációban.