Java 8 – Les expressions lambda – Java 8 arrive bientôt !



Java 8 – Les expressions lambda – Java 8 arrive bientôt !

0 0


presentation-java8-lambda

Présentation succincte des expressions lambda dans Java 8

On Github ymauray / presentation-java8-lambda

Java 8

Les expressions lambda

Yannick Mauray / @yannickmauray

Java 8 arrive bientôt !

Depuis le temps qu'on l'attend... :)

Sortie officielle : 18 mars 2014

Ce que l'on aura dans Java 8

  • Les expressions lambda
  • Une nouvelle API pour les collections
  • Les méthodes par défaut dans les interfaces

Ce que l'on n'aura pas dans Java 8

  • Les modules

Les expressions lambda

  • Ce sont des fonctions que l'on peut passer en paramètre à une fonction
  • Ce sont des implémentation à la volée d'interfaces fonctionnelles
  • Elles existent depuis longtemps dans d'autres langages

    Lisp, Scala, Groovy, Javascript, PHP, ...
  • On en fait aussi en Java depuis longtemps, mais sans le savoir

Exemple : un listener

						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) {
            ...
        }
    }
});
					

La syntaxe

Une expression lambda se compose des éléments suivants :

  • Une liste de paramètres formels séprarés par une virgule
  • Une flèche
  • Un corps de méthode
						(a, b) -> {
	return a + b;
}
					
						(a, b) -> return a + b;
					
						(a, b) -> a + b;
					

Exemple : la calculatrice (1/2)

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

Exemple : la calculatrice (2/2)

Avant Java 8
							Operation addition = new Operation() {
    @Override
    public int effectuer(int a, int b) {
        return a + b;
    }
};

int resultat = calculatrice.calculer(10, 2, addition);
						
Avec Java 8
							Operation addition = (a, b) -> a + b;

int resultat = calculatrice.calculer(10, 2, addition);
						

Que devient notre listener ?

Avant
							ValueModel vm = ...;
vm.addValueChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        MultilingualString multilingualString = 
            (MultilingualString) evt.getNewValue();
        if (multilingualString != null) {
            ...
        }
    }
});
						
Après
							ValueModel vm = ...;
vm.addValueChangeListener(evt -> {
    MultilingualString multilingualString = 
        (MultilingualString) evt.getNewValue();
    if (multilingualString != null) {
        ...
    }
});
						

Expressions lamba et scope (1/2)

Ceci ne compile pas : “x cannot be resolved or is not a field”
						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;
});
					

Expressions lamba et scope (2/2)

Ceci était valide
						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);
}
					

Rapidement pour finir (1/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());
					

Rapidement pour finir (2/2)

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

Références

JDK™ 8 Early Access Releases
https://jdk8.java.net/download.html

Java™ Platform, Standard Edition 8 API Specification
http://download.java.net/jdk8/docs/api/