La programmation fonctionnelle avec Scala
Scala possède plusieur types polymorphes. Celà permet de rendre le langage plus expressif tout en garantissant un typage fort.
Option
Le type Option est un type abstrait générique permettant de caractériser la présence ou l'absence de valeur.
On peut le voir comme un type de collection pouvant contenir 1 ou 0 élément.
Option[A] utilise deux sous types :
- Some[A] qui contient une valeur de type A
- Nones qui ne contient rien
Option fournit de nombreuses méthodes dont :
- map(f) applique la fonction f sur la valeur contenue, si l'option contient une valeur
- isDefined: Boolean (et isEmpty: Boolean) retournant true si l'option (ne) contient (pas) une valeur
- get: A retourne la valeur contenue dans l'option ou envoie une exception si l'option est vide
- getOrElse(b): A retourne la valeur contenue dans l'option, renvoie b si l'option est vide
Il permet par exemple de remplacer les code de type «if (a=null) return z else return a» par un a.getOrElse(z)
En quelque mot
Pour terminer j'évoquerai sans approfondir deux autres concepts de scala : les Future et le for-comprhension.
Future
Le type Future est un autre type abstrait générique. Il est utilisé pour manipuler des résultats non encore calculés.
On peut ainsi écrire le code qui sera executé une fois le calcul terminé. On peut comparer ça à l'appel d'une fonction callback à la fin d'un Thread.
Les Futures permettent d'écrire des programmes concurrent en évitant de manipuler directement les Thread. S'épargnant ainsi :
- les côut de création d'un Thread
- l'éventuelle gestion d'un pool de Thread
- et surtout les problèmes d'interblocage
for-comprehension
Pour manipuler plusieurs Option ou plusieurs Future simultanément Scala offre une syntaxe fort pratique : le for comprehension.
Il se décompose en deux blocs :
- for { …instructions… } dans le quel on peut affecter des valeur en utilisant un Future ou une Option
- yield { …instructions… } dans le quel on peut utiliser les valeurs déclarées précédement