Nyheder og Jobs

No More Loops With Lambdaj

Efter lige at have stået lidt i gatecrasher køen, da jeg (Søren) vanen tro gik til en anden session end den jeg var signet til, kom jeg ind til en session med founderen af Lambdaj.

Taleren var italiener, med relativ stor accent, men det var ok, man kunne godt følge med, og han havde jo naturligt nok styr på det.

Lambdaj er et statisk library til at manipulere med collections og er umiddelbart ment for at fjerne alle de uoverskuelige loops man har i sin kode, og som sådan virker det jo også rimelig ok, især til lidt simplere ting.

Se f.eks. forskellen her :

Klassisk Java version :

1
2
3
4
5
6
List<Person> sortedByAgePersons = new ArrayList<Person>(persons);
Collections.sort(sortedByAgePersons, new Comparator<Person>() {
        public int compare(Person p1, Person p2) {
           return Integer.valueOf(p1.getAge()).compareTo(p2.getAge());
        }
});

Lambdaj version :

1
List<Person> sortedByAgePersons = sort(persons, on(Person.class).getAge());

Men det stoppede naturligvis ikke der fordi der er et hav af utility metoder til at finde ting og sager.

  • min
  • max
  • select
  • having
  • og så videre

Faktisk så omfattende at jeg næsten vil kalde det SQL for java, og det går næsten ud over læsbarheden, men når man tænker på hvordan det vil se ud ved at iterere over collections er det en god konkurrent.

MEN … det skal jo være hvor man har et praktisk behov, altså at sidde og lede efter objekter i lister klares jo ofte up front som en del af en hibernate query, så det skal i hvert fald være i situationer hvor man ikke har data i en form for queryable database.

Stadigvæk smart nok til de mindre og simple udvælgelser i lister.

Han måtte jo så til gengæld krybe til korset og fortælle om performance, fordi lambdaj er p.t. ca. en faktor fem langsommere end at bruge collections iteratorer osv.. Men der er fokus og seneste version af lambdaj gjorde det allerede 35% hurtigere.

Men den kommer jo aldrig til at slå Collections , da den bruger disse i bund og grund.

Han fortalte derefter om closures og det ligner da lidt, men så vidt jeg kan se er det hele bygget omkring det static library han har lavet. Bedøm selv:

1
2
3
Closure println = closure(); { 
        of(System.out).println(var(String.class)); 
}

Og her brugen af samme.

1
println.apply("one");

eller

1
println.each("one", "two", "three");

Konklusion : lambdaj er ganske fint til simple collection manipulation og helt sikkert også fint til mere avancerede ting givet man ikke har en form for database som grundlag for sine forretningsobjekter.