On Github ymauray / presentation-java8-lambda
Yannick Mauray / @yannickmauray
Developper preview disponible depuis septembre 2013
Elles existent depuis longtemps dans d'autres langages
Lisp, Scala, Groovy, Javascript, PHP, ...public interface PropertyChangeListener { void propertyChange(PropertyChangeEvent evt); }
ValueModel vm = ...; vm.addValueChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { MultilingualString multilingualString = (MultilingualString) evt.getNewValue(); if (multilingualString != null) { ... } } });
Une expression lambda se compose des éléments suivants :
(a, b) -> { return a + b; }
(a, b) -> return a + b;
(a, b) -> a + b;
public interface Operation { public int effectuer(int a, int b); }
public class Calculatrice { public int calculer(int a, int b, Operation operation) { return operation.effectuer(a, b); } }
Operation addition = new Operation() { @Override public int effectuer(int a, int b) { return a + b; } }; int resultat = calculatrice.calculer(10, 2, addition);
Operation addition = (a, b) -> a + b; int resultat = calculatrice.calculer(10, 2, addition);
ValueModel vm = ...; vm.addValueChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { MultilingualString multilingualString = (MultilingualString) evt.getNewValue(); if (multilingualString != null) { ... } } });
ValueModel vm = ...; vm.addValueChangeListener(evt -> { MultilingualString multilingualString = (MultilingualString) evt.getNewValue(); if (multilingualString != null) { ... } });
this.x = 12; int resultat = calculatrice.calculer(10, 2, new Operation() { @Override public int effectuer(int a, int b) { System.out.println(this.x); return a + b; } });Alors que ceci est valide
this.x = 12; int resultat = calculatrice.calculer(10, 2, (a, b) -> { System.out.println(this.x); return a + b; });
void faireQuelqueChose(int x) { faireAutreChose(12, new MonIterface() { @Override public int maMethod(int x) { return x + 2; } }); }Alors que ceci ne l'est plus
void faireQuelqueChose(int x) { faireAutreChose(12, x -> x + 2); }
L'API collection à été modifiée
String[] noms = new String[] {"Alice", "Bob", "Carole"}; List<Personne> listePersonnes = new ArrayList<Personne>(); for (String nom : noms) { Personne personne = new Personne(nom); if (personne.age() > 18) { listePersonnes.add(personne); } }
List<Personne> personnesMajeures = Stream.of("Alice", "Bob", "Carole") .map(Personne:new) .filter(p -> p.age() > 18) .collect(Collectors.toList());
Les interfaces et les méthodes par défaut
public interface Personne { public String getNom(); public String getPrenom(); default public String getNomAffichage() { return this.getNom() + ", " + this.getPrenom(); } }