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();
}
}