I’ve just been playing with the first fruits of the Lambda project. It takes a bit of messing around to get going; you need to downgrade the version of HotSpot in the lambda repository to b93 as so:
$ hg fclone http://hg.openjdk.java.net/lambda/lamdba $ cd lambda/hotspot $ hg update -r jdk7-b93
Once done, you can build code using closures like so:
$/mnt/builder/lambda/j2sdk-image/bin/javac -XDallowFunctionTypes Closures.java
I found that it’s pretty easy to implement a simple version of map which takes a collection of objects and a function to produce a collection of the results:
public static <S,T> List<S> map(List<T> s, #S(T) func)
{
List<S> list = new ArrayList<S>();
for (T t : s)
list.add(func.(t));
return list;
}
public static void main(String[] args)
{
#Integer(Integer) square = #(Integer x)(x * x);
List<Integer> list = Arrays.asList(new Integer[]{4,5,6});
List<Integer> squares = map(list, square);
System.out.println(list + " squared is " + squares);
}
This can be run as follows:
$ /mnt/builder/lambda/j2sdk-image/bin/java Closures [4, 5, 6] squared is [16, 25, 36]
Sadly, the current implementation doesn’t like autoboxing too much. javac crashes if you pass an Integer into a function requiring an int, and you need an #Integer(Integer) function for the above; javac throws an error if you try to use a #int(int).