En mathématiques et en informatique, les fonctions d’ordre supérieur ou fonctionnelles sont des fonctions qui ont au moins une des propriétés suivantes :
- elles prennent une ou plusieurs fonctions en entrée ;
- elles renvoient une fonction. — wikipedia
Dans ce tutoriel sur les fonctions d’ordre supérieur, je montrerai quelques exemples de fonctions d’ordre supérieur en Java.
Tri des collections
Le premier exemple d’une fonction d’ordre supérieur est la méthode Collections.sort() qui prend un comparateur comme paramètre. En voici un exemple :
List<String> list = new ArrayList<>();
list.add("One");
list.add("Abc");
list.add("BCD");
Collections.sort(list, (String a, String b) -> {
return a.compareTo(b);
});
System.out.println(list);
Le Collection.sort() prend deux paramètres. Le premier paramètre est une liste et le second paramètre est une expression lambda (fonction). Le paramètre lambda ici est celui qui fait de la Collections.sort() une fonction d’ordre supérieur.
Tri par ordre inversé
Voici un autre exemple de fonction d’ordre supérieur. Cette fois-ci, il s’agit d’une fonction qui retourne une autre fonction comme résultat:
Comparator<String> comparator = (String a, String b) -> {
return a.compareTo(b);
};
// ou simplement par exemple:
// Comparator<String> comparator = Comparator.naturalOrder();
Comparator<String> comparatorReversed = comparator.reversed();
Collections.sort(list, comparatorReversed);
System.out.println(list);
Cet exemple crée dans un premier temps une expression lambda Java qui implémente l’interface du Compactor.
Ensuite, l’exemple appelle la méthode reversed() du comparateur lambda. La méthode reversed() renvoie un nouvelle expression lambda du comparateur, qui inverse le résultat renvoyé par la première implémentation du comparateur. Par “inverser”, je veux dire qu’elle retourne simplement -1 * comparator.compare(a,b)
Comme la méthode reversed() renvoie une lambda (fonction), la méthode reversed() est considérée comme une fonction d’ordre supérieur.
Troisièmement, l’exemple trie la liste des chaînes de caractères à l’aide de la méthode Collections.sort().