Nieuw in Java 8: lambda-expressies

 
20 december 2013

Sinds april 2012 wordt er al gewerkt aan Java 8, de opvolger van Java 7. In de nieuwste versie van de programmeertaal zijn een aantal nieuwe concepten opgenomen, welke qua impact op het platform vergelijkbaar gaan zijn met de verbeteringen die  anno 2004 in Java 5 werden geïntroduceerd. Toevoegingen als generics en for…in loops hebben de taal destijds gevormd en een nieuw gezicht gegeven. Java 8 gaat de taal op een zelfde manier een flinke stap vooruit brengen. In deze blogserie zal ik een aantal concepten behandelen die in Java 8 worden geïntroduceerd.
1. Lambda-expressies
2. Method references (in een volgende blog)
3. Extension methods (in een volgende blog)
4. @FunctionalInterface (in een volgende blog)
5. Streams (in een volgende blog)

Lambda-expressies

De ‘anomieme functie’ die we misschien wel kennen uit JavaScript en C# is vanaf Java 8 ook op het Java-platform beschikbaar. Met een lambda-expressie kun je een stuk logica meegeven aan een methode als argument. Hiermee wordt het mogelijk om een aantal constructies een stuk korter op te schrijven dan voorheen.

Door een collectie lopen

Wanneer je in Java voor elk element in een collectie een bepaalde actie wilt uitvoeren, deed je voorheen iets soortgelijks als dit:

List theJediOrder = new ArrayList();
theJediOrder.add("Yoda");
theJediOrder.add("Obi-Wan Kenobi");
theJediOrder.add("Luke Skywalker");

for (String jedi : theJediOrder) {
    System.out.println(jedi);
}

Met een lambda kunnen we bovenstaande code als volgt schrijven:

List theJediOrder = new ArrayList();
theJediOrder.add("Yoda");
theJediOrder.add("Obi-Wan Kenobi");
theJediOrder.add("Luke Skywalker");
theJediOrder.forEach(jedi -> System.out.println(jedi));
for (String jedi : theJediOrder) {
    System.out.println(jedi);
}

Flexibele filters

Gegeven de klasse Jedi:

public class Jedi {
    private String name;
    private Species species;
    private int age;

    public String getName() { return name; };
    public Species getSpecies() { return species; };
    public int getAge() { return age; };
}

Wanneer we nu een lijst van Jedi willen hebben en daarop willen filteren, dan is de klassieke aanpak wellicht:

public class JediFinder() {
    public static List findJediBySpecies(List<Jedi> theJediOrder, Species species) {
        List<Jedi> filteredJedi = new ArrayList<Jedi>();
        for (Jedi jedi : theJediOrder) {
            if (jedi.getSpecies().equals(species)) {
                filteredJedi.add(jedi);
            }
        }
        return filteredJedi;
    }

    public static List findJediByAge(List theJediOrder, int minAge, int maxAge) { ... }
    public static List findJediByName(List theJediOrder, String name) { ... }
}

Met lambda’s kan bovenstaande oplossing een stuk korter én flexibeler worden opgelost:

public interface Predicate<T> {
    boolean matches(T t);
}

public class JediFinder {
    public static List<Jedi> findJediWithPredicate(List<Jedi> theJediOrder, Predicate<Jedi> predicate) {
        List<Jedi> filteredJedi = new ArrayList<Jedi>();
        for (Jedi jedi : theJediOrder) {
            if (predicate.matches(jedi)) {
                filteredJedi.add(jedi);
            }
        }
        return filteredJedi;
    }
}

Met de volgende aanroep is nu het zoeken van Jedi mogelijk (in dit geval alle menselijke Jedi of ouder dan 600):

JediFinder.findJediWithPredicate(jedi -> jedi.getSpecies().equals(Species.HUMAN) || jedi.getAge() > 600);

Meer lezen?

Lees meer over lambda-expressies in de Java Tutorials van Oracle.

Java 8 verkrijgen

Java 8 zal beschikbaar zijn vanaf 18 maart 2014, maar een early access release is nu al beschikbaar.

Volgende keer

Volgende keer meer over Java 8, dan zal het gaan over extension methods!


Werken met ?
Kijk dan bij onze mogelijkheden voor zowel starters als ervaren engineers.


Categorieën: Development, Java (EE)

Tags: ,