Cette présentation aura pour objectif d’introduire le langage de programmation Scala. Ce dernier bénéficie depuis plusieurs mois d’un véritable engouement qui se reflète au regard de la communauté française croissante.
Pour cela Ludwine Probst et Florent Lagrede reviendront donc sur les notions fondamentales, illustrées d’exemples sur des problèmes récurrents de programmation, afin de dégager les spécificités de ce langage et certains de ses atouts.
Aucune connaissance de Scala n’est donc nécessaire, seulement l’envie de découvrir un nouveau langage.
MongoDB : la base NoSQL qui réinvente la gestion de données
Introduction à scala
1. Introduction à
Scala
Introduction à Scala par Ludwine et Florent
2. Florent Lagrède
développeur Java chez voyages-sncf.com
@flowlag
Ludwine Probst
développeuse Java chez voyages-sncf.com
DuchessFr et GDG member
@nivdul
3. Plan de la soirée
Introduction à Scala...
Partie 1
Généralités
Partie 2
Présentation des concepts
Partie 3
Démonstration avec une appli
4. Histoire
Nom : scala vient de "scalable langage"
Auteur: Martin Odersky
Création : 2003
Lieu : EPFL (Lausanne)
But : être élégant et concis, mais pas que...
5. Dans la communauté
PSUG (Paris Scala User Group)
• soirée chaque mois avec 60-100 membres
• sujets techniques, retours d'expériences,
présentations de projets open-source...
6. Scala en quelques mots
• langage mélangeant programmation orientée-
objet et fonctionnelle
• tourne sur la JVM
• compatible avec les librairies Java
• statiquement typé
• soucis de la concurrence (immutable)
• inférence de type
• tout est objet (hiérarchie des classes)
• et ça se veut être concis
7. // en Java
class Album {
private int id;
private String name;
public Album(int id, String name) {
this.id = id;
this.name = name;
}
}
// en Scala
class Album(id: Int, name: String)
8. La programmation fonctionnelle
• exprime les fonctions au sens mathématique
• exclut le changement d'état lors de l'évaluation
de fonctions
• élimine les effets de bords
• s'oppose à la programmation impérative
10. Quelques outils pour coder en Scala
• REPL (Read-Evaluate-Print Loop)
• sbt (simple-build-tool)
• éditeur de texte
(sublimtext,notepad++...)
• Eclipse/IntelliJ
http://typesafe.com/stack/downloads/scala-ide
• scaladoc http://www.scala-lang.org/
11. Démo
• création d'un projet scala via Eclipse
• utilisation du worksheet
• petits tests en scala via le REPL
• compilation/exécution (tests) d'un projet via sbt
12. Objectifs de la soirée
• présenter les bases, du moins certaines
o mutable/immutable, trait, case class, sealed,
List, high order function, pattern matching...
o voir la syntaxe
• regarder de près une appli en Scala
15. Les classes
Définition :
• définition standard
• pas de mot clé public
• un fichier source peut contenir plusieurs classes
et elles sont toutes par défaut public
16. Les case classes
Définition :
• objet non modifiable après instanciation
• méthodes equals, toString, hashcode...
implicitées
• constructeur implicité
• pas de new
• peut se décomposer avec la notion de Pattern
Matching
17. Exemples
case class Album(id:Int, name:String)
Ces 3 écritures suivantes sont équivalentes :
val album = new Album(3, "Paris")
val album = Album(3, "Paris")
val album = Album.apply(3, "Paris")
album.name = qu'obtient-on???
18. Les getters/setters (1/2)
//Java
public class Image() {
private String name;
public String getName() {...}
public void setName(String name) {...}
}
//Scala
class Image(var name:String)
19. Les getters/setters (2/2)
En scala,
• les getters/setters sont générés pour la JVM
• on peut les surcharger
• ils sont privés si l'attribut est privé
• il est possible d'empêcher leur génération avec
la syntaxe suivante
private[this] name:String
20. Val & Var
Définition :
• val
o déclaration d'attribut : variable non
modifiable
o déclaration de paramètre de classe : getter
implicite
• var
o déclaration d'attribut : variable modifiable
o déclaration de paramètre de classe : getter et
setter implicite
21. Exemples
class Image(var name: String)
val imageA = new Image("MyImageA")
val imageB = new Image("MyImageB")
Si on écrit ça :
imageA = imageB
Que se passe-t-il ?
22. Les traits
Définition :
c'est comme une class sauf qu'il y a le mot-clé
trait. C'est l'équivalent de l'interface en Java sauf
qu'on peut y implémenter des méthodes.
trait ImageInfos {
val image:Image
def ImageInfos:String = image.name
}
23. Exemples
Possibilité d'un héritage multiple :
trait ComputeAverageScore
trait AnotherOne
class Image extends ImageInfos with
ComputeAverageScore with AnotherOne {
val name = "Paris"
}
Pas de paramètres de 'classe' :
trait ImageInfos(image: Image) // ne
compile pas
24. Les Collections
• Utilise le trait Iterable
• Immutable par défaut
• Fonctions d'ordre supérieure
o map
o filter
o foreach
Exemples de collection :
List, Map, Set, Vector...
25. Les Lists
Définition :
La classe List repose sur les deux case classes :
• Nil représente une liste vide
• :: (se prononce “cons”),
où x::xs représente la liste dont le premier
élément est x, suivi du reste des éléments xs.
26. Les Lists
Les 3 fonctions clé à retenir :
• head : renvoie le premier élément d’une liste
• tail : renvoie la liste excepté son premier
élément
• isEmpty : renvoie true si la liste est vide,
false sinon
27. Quelques exemples...
val scores = List(1,2,3)val names =
List(“a”,“b”, “b”)
val list =
List(List(1,0),List(1,1),List(0,1))
val empty: List[Nothing] = List( )
val scores = 1 :: 2 :: 3 :: Nil
val names = “a” :: (“b” :: (“b” :: Nil))
28. Fonction partielle
Définition :
• une fonction partielle qui s'exécute ou non en
fonction de ses paramètres
• elle doit obligatoirement définir 2 méthodes
o isDefinedAt (condition d'exécution)
o Apply (code exécuté)
29. Fonction partiellement appliquée
Définition :
• fonction à laquelle on n'applique pas tous les
arguments, créant ainsi une autre fonction.
• peut appliquer aucun ou tous les arguments
d'une fonction
30. Les fonctions de plus haut niveau
• Expression lambda
o x: Int => x + 1 est équivalent à
f(x: Int) = {x + 1}
• Peut prendre une autre fonction en paramètre
• Peut être retournée en tant que résultat
• Peut être déclarée à l'intérieur d'une autre fonction
• Peut-être stockée dans une variable
Exemples :
map, filter, flatten, flatmap...
32. Les options (2/2)
L'intérêt des Options ?
Imaginons que l’on veuille trouver une
personne dans une BDD...
def findImage(id: Int): Option[Image]
33. Pattern Matching
Définition :
Le pattern matching peut être assimilé au switch
case d'autres langages comme Java.
e match {case p1 => e1 ... case pn => en }
pi représente les patterns et ei la valeur renvoyée
dans le cas où le pattern pi match e.
Erreur MatchError renvoyée si besoin.
34. Exemples (1/4)
def applyEvent(event: Event) = event match
{
case AddImage(image) => add(image)
case RemoveImage(withId) =>
remove(withId)
case SearchImages(term) => search(term)
case _ => this.image
}
C'est quoi ce "_" ?
35. Exemples (2/4)
Avec les options :
case SortImages(criteria) => criteria match {
case Some(criteria) => sort(criteria)
case None => this.images
}
36. Exemples (3/4)
On peut faire du Pattern Matching sur un peu tout !
def describe(x: Any) = x match {
case 5 => "five"
case true => "truth"
case "hello" => "hi!"
case Nil => "the empty list"
case _ => "something else"
}
37. Exemples (4/4)
Avec les listes :
def eval(list:List[Int]) = list match {
case Nil => println("vide")
case x::Nil => println("un seul élément")
case x::xs => println("au moins 2 élemts")
}
38. Sealed Trait
Définition : le mot-clé sealed devant un
trait :
ça facilite le Pattern Matching !
Exemple :
sealed trait Criteria
case class ByName extends Criteria
case class ByDate extends Criteria