Je voudrais ajouter du code à une très belle explication de @biziclop :
Exemple de curryfication en Java fonctionnel :
BiFunction> currying = (x, y) -> z -> x * y / z;
System.out.println(currying.apply(5, 6).apply(2)); // 15
Comme vous pouvez le constater, la lambda est paramétrée. Dans cet exemple, nous effectuons une curryfication pour multiplier 5 par 6, puis diviser par 2.
Tout d'abord, apply(5)
est invoqué et la variable x
prend la valeur 5
et la fonction devient 5 * y / z
Ensuite, apply(6)
est invoqué et la variable 'y' prend la valeur '6' et la fonction devient 5 * 6 / z
Ensuite, apply(2)
est invoqué et la variable 'z' prend la valeur '2' et la fonction devient 5 * 6 / 2
Comme vous pouvez le voir, la curryfication de cette manière est peu utile en Java. La curryfication est utile dans les langages fonctionnels purs, où les fonctions sont limitées à un seul argument et elles bénéficient de la curryfication, qui transforme une fonction prenant plusieurs arguments, de sorte qu'elle puisse être appelée plusieurs fois avec chaque invocation d'un seul argument.
Alors, comment pouvez-vous bénéficier de la curryfication en Java ?
Cela est utile lorsque vous devez paramétrer une fonction à plusieurs niveaux. Par exemple, disons que nous avons plusieurs collections, représentant différentes catégories, et que nous voulons récupérer des éléments particuliers de chaque catégorie. Voici un exemple simple, donné deux collections, représentant des nombres écrits, catégorisés comme ones
et tens
. Exemple :
public class Currying {
private static List ones =
Arrays.asList("Zero", "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine");
private static List tens =
Arrays.asList("Zero", "Ten", "Twenty", "Thirty", "Forty",
"Fifty", "Sixty", "Seventy", "Eighty", "Ninety");
public static Function> getNumbers() {
return units -> number -> {
return units == "Ones" ? ones.get(number % 10)
: tens.get(number % 10);
};
}
public static void main(String[] args) {
Function> currying = getNumbers();
System.out.println(currying.apply("Tens").apply(8)); // 80
System.out.println(currying.apply("Ones").apply(2)); // 2
}
}
Dans l'exemple ci-dessus, la fonction currying
renvoie une autre fonction currying.apply("Ones").apply(2))
;
Tout d'abord, apply("Tens")
est invoqué et la variable units
devient Tens
Ensuite, apply(2)
est invoqué et la variable number
devient 8
en récupérant 80
de la collection tens
.
La même logique s'applique à currying.apply("Ones").apply(2))
.