Introduction à scala
description
Transcript of Introduction à scala
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 !