introduction à scala
DESCRIPTION
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.TRANSCRIPT
Introduction à Scala
Introduction à Scala par Ludwine et Florent
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
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
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...
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...
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
// 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)
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
Scala dans le milieu professionnel
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/
• 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
Démo
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
Présentation de concepts clés
Introduction à Scala par Ludwine et Florent
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
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
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???
Exemples
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)
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
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
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 ?
Exemples
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
}
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
Exemples
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...
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.
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
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))
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é)
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
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...
Les options (1/2)
Définition :
Le type Option désigne une valeur optionnelle et c'est une Collection.
L'intérêt des Options ?
Imaginons que l’on veuille trouver une personne dans une BDD...
def findImage(id: Int): Option[Image]
Les options (2/2)
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.
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 "_" ?
Exemples (1/4)
Avec les options : case SortImages(criteria) => criteria match {
case Some(criteria) => sort(criteria)
case None => this.images
}
Exemples (2/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"
}
Exemples (3/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")
}
Exemples (4/4)
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
Présentation de l'application
• moteur de recherche d'image
• le modèle : Image, Album
• technos : scala 2.10
Quelques liens
Programming in Scala
Scala in Depth
Scala for the impatient
Pour apprendre scala par la pratique :
https://www.coursera.org/
Merci !