You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _fr/tour/higher-order-functions.md
+112-1
Original file line number
Diff line number
Diff line change
@@ -3,10 +3,121 @@ layout: tour
3
3
title: Higher-order Functions
4
4
partof: scala-tour
5
5
6
-
num: 7
6
+
num: 10
7
7
8
8
language: fr
9
9
10
10
next-page: nested-functions
11
11
previous-page: mixin-class-composition
12
12
---
13
+
14
+
Les fonctions d'ordre supérieur prennent d'autres fonctions en paramètres ou retournent une fonction en résultat.
15
+
C'est possible car les fonctions sont des valeurs de première classe en Scala.
16
+
La terminologie peut devenir une peu confuse à ce point, et nous utilisons l'expression "fonction d'ordre supérieur" à la fois pour les méthodes et les fonctions qui prennent d'autres fonctions en paramètres ou retournent une fonction en résultat.
17
+
18
+
Dans le monde du pur orienté objet, une bonne pratique est d'éviter d'exposer des méthodes paramétrées avec des fonctions qui pourraient exposer l'état interne de l'objet. Le fait d’exposer l'état interne de l'objet pourrait casser les invariants de l'objet lui-même ce qui violerait l'encapsulation.
19
+
20
+
Un des exemples les plus communs est la fonction d'ordre supérieur `map` qui est diponible pour les collections en Scala.
`doubleSalary` est une fonction qui prend un seul entier, `x` et retourne `x * 2`. La partie à gauche de la flèche `=>` est la liste de paramètres, et la valeur de l'expression à droite est ce qui est retourné. Sur la ligne 3, la fonction `doubleSalary` est appliquée à chaque élément dans la liste des salariés.
29
+
30
+
Pour réduire le code, nous pouvons faire une fonction anonyme et la passer directement en argument de `map` :
31
+
32
+
```scala:nest
33
+
val salaries = Seq(20000, 70000, 40000)
34
+
val newSalaries = salaries.map(x => x * 2) // List(40000, 140000, 80000)
35
+
```
36
+
37
+
Notez que `x` n'est pas déclaré comme un `Int` dans l'exemple ci-dessus. C'est parce que le compilateur peut inférrer le type en se basant sur le type que méthode `map` attend. (voir [Currying](/tour/multiple-parameter-lists.html)). Une autre façon d'écrire le même morceau de code encore plus idiomatique serait :
38
+
39
+
```scala mdoc:nest
40
+
valsalaries=Seq(20000, 70000, 40000)
41
+
valnewSalaries= salaries.map(_ *2)
42
+
```
43
+
44
+
Sachant que le compilateur Scala sait déjà quel est le type des paramètres (un seul `Int`), vous pouvez fournir uniquement la partie de droite de la fonction.
45
+
La seule contrepartie c'est que vous devez utiliser `_` à la place du nom du paramètre (c'était `x` dans l'exemple précédent).
46
+
47
+
## Convertir les méthodes en fonctions
48
+
49
+
Il est aussi possible de passer des méthodes comme arguments aux fonctions d'ordre supérieur, parce que le compilateur Scala va convertir la méthode en fonction.
defforecastInFahrenheit:Seq[Double] = temperatures.map(convertCtoF) // <-- passing the method convertCtoF
57
+
}
58
+
```
59
+
60
+
Ici la méthode `convertCtoF` est passée à la fonction d'ordre supérieur `map`. C'est possible car le compilateur convertit `convertCtoF` vers la fonction `x => convertCtoF(x)` (note : `x` sera un nom généré qui sera garanti d'être unique dans le scope).
61
+
62
+
## Les fonction qui acceptent des fonctions
63
+
64
+
Une raison d'utiliser les fonctions d'ordre supérieur est de réduire le code redondant. Suposons que vous souhaitez des méthodes qui augmentent le salaire de quelqu'un en fonction de différents facteurs. Sans créer de fonction d'ordre supérieur, cela ressemblerait à ça :
La nouvelle méthode, `promotion`, prend les salaires plus une fonction du type `Double => Double` (càd. une fonction qui prend un Double et retourne un Double) et retourne le produit.
101
+
102
+
Les méthodes et les fonctions expriment généralement des comportements ou des transformations de données, donc avoir des fonctions qui composent en se basant sur d'autres fonctions peut aider à construire des mécanismes génériques. Ces opérations génériques reportent le verrouillage de l'intégralité du comportement de l'opération, donnant aux clients un moyen de contrôler ou de personnaliser davantage certaines parties de l'opération elle-même.
103
+
104
+
## Les fonctions qui retournent des fonctions
105
+
106
+
Il y a certains cas ou vous voulez générer une fonction. Voici un exemple de méthode qui retourne une fonction.
Notez le type de retour de urlBuilder `(String, String) => String`. Cela veut dire que la fonction anonyme retournée prend deux Strings et retourne une String. Dans ce cas, la fonction anonyme retournée est `(endpoint: String, query: String) => s"https://www.example.com/$endpoint?$query"`
0 commit comments