J'ai trouvé l'extrait de code suivant:

Function<Integer, Predicate<Integer>> smallerThan = x -> y -> y < x;
List<Integer> l = Arrays.asList(5, 6, 7, 23, 4, 5645,
    6, 1223, 44453, 60182, 2836, 23993, 1);

List<Integer> list2 = l.stream()
    .filter(smallerThan.apply(l.get(0)))
    .collect(Collectors.toList());

System.out.println(list2);

En sortie, je reçois:

[4, 1]

Comment la fonction smallerThan dans cet exemple fonctionne-t-elle, étant donné que nous ne passons qu'un seul paramètre smallerThan.apply(l.get(0))?

15
masterofdisaster 26 nov. 2017 à 14:02

3 réponses

Meilleure réponse

smallerThan est un Function qui accepte un seul Integer et renvoie un Predicate<Integer> (un Predicate<Integer> est une fonction qui accepte un seul Integer et renvoie a boolean).

smallerThan.apply(l.get(0)) renvoie un Predicate<Integer> qui ressemble à ceci:

y -> y < l.get(0)

C'est-à-dire qu'il renvoie true si l'entrée qui lui est passée est inférieure à l.get(0).

Lorsque vous passez ce Predicate à filter, votre pipeline Stream ne conserve que les éléments plus petits que l.get(0).

Votre pipeline peut être réécrit comme suit:

List<Integer> list2 = l.stream()
    .filter(y -> y < l.get(0))
    .collect(Collectors.toList());

Puisque l.get(0) est 5, votre pipeline renvoie tous les éléments de la liste d'origine plus petits que 5.

19
Zabuzard 26 nov. 2017 à 12:51

Cela s'appelle «currying» et c'était possible avant Java 8 aussi via des classes anonymes par exemple, mais c'était beaucoup plus verbeux. En fin de compte, c'est un Function qui renvoie un Function et bien que ce ne soit pas (encore) répandu en Java, dans d'autres langages fonctionnels, il est assez utilisé.

13
Andrew T. 26 nov. 2017 à 14:55

La fonction smallerThan accepte un nombre et renvoie un objet Predicate, auquel cas nous appliquons ce prédicat à chaque élément du flux.

Ainsi, l.get(0) récupérera la première valeur de la liste l qui est (5), nous la passons ensuite à la fonction smallerThan et cette fonction retourne un prédicat avec les critères { {X4}} qui se lit comme "étant donné un nombre, renvoie vrai s'il est inférieur à 5" donc la sortie est [4, 1]

8
Ousmane D. 26 nov. 2017 à 11:14
47495381