Méthodes · ch. 6, p. 50
Références de méthode
Une lambda compacte qui se contente d'appeler une méthode existante. Quatre formes : statique, instance liée, instance non liée, et constructeur.
Function<String, Integer> parse = Integer::parseInt; // statique
Supplier<Integer> size = list::size; // instance liée
Function<String, Integer> length = String::length; // instance non liée
Supplier<List<String>> factory = ArrayList::new; // constructeur
La forme non liée est celle qui surprend le plus : String::length devient
une fonction à un argument dont l’argument est le récepteur.
Les références liées capturent avidement
List<String> list = new ArrayList<>();
Supplier<Integer> s = list::size;
list = new ArrayList<>(List.of("a"));
s.get(); // 0 — liée à l'objet original, pas à la variable
Le récepteur est évalué au moment où la référence est créée. Une lambda
() -> list.size() ne compilerait pas ici, puisque list n’est pas
effectivement finale.
Ambiguïté
Integer::parseInt pourrait cibler Function<String,Integer> ou
ToIntFunction<String> ; le type cible décide. Quand les deux sont
plausibles dans le contexte, le compilateur signale une ambiguïté et une
lambda explicite la résout.
2 questions sur ce concept S'entraîner