Tutoriel Scala
โก Rรฉsumรฉ intelligent
Ce tutoriel prรฉsente Scala, un langage statiquement typรฉ basรฉ sur la JVM qui allie programmation orientรฉe objet et fonctionnelle. Ce guide aborde l'installation, la syntaxe, les fonctionnalitรฉs principales et les frameworks qui font de Scala le langage idรฉal pour dรฉvelopper des applications modernes, concurrentes, รฉvolutives et concises.

Qu'est-ce que Scala ?
Scala Scala est un langage de programmation statiquement typรฉ qui combine programmation orientรฉe objet et fonctionnelle afin d'amรฉliorer la scalabilitรฉ des applications. Il s'exรฉcute principalement sur la plateforme JVM, et les dรฉveloppeurs peuvent รฉgalement l'utiliser pour รฉcrire des logiciels pour plateformes natives via Scala-Native, ou pour navigateur via Scala.js. Javascรฉnario Durรฉe.
Scala est un langage รฉvolutif utilisรฉ pour dรฉvelopper des logiciels multiplateformes, d'oรน son nom. Ce langage a รฉtรฉ conรงu pour rรฉsoudre plusieurs problรจmes de verbositรฉ rencontrรฉs dansโฆ Java tout en restant concis. Martin Odersky a conรงu Scala, et sa premiรจre version publique est apparue en 2004.
Pourquoi apprendre Scala
Voici les principales raisons d'apprendre le langage de programmation Scala :
- Scala est facile ร apprendre pour les programmeurs orientรฉs objet et Java dรฉveloppeurs, et c'est devenu l'un des langages populaires ces derniรจres annรฉes.
- Scala offre des fonctions de premier ordre aux utilisateurs.
- Scala peut รชtre exรฉcutรฉ sur le JVM, ouvrant la voie ร l'interopรฉrabilitรฉ avec d'autres langages.
- Il est conรงu pour les applications concurrentes, distribuรฉes et rรฉsilientes, pilotรฉes par les messages, ce qui en fait l'un des langages les plus demandรฉs de cette dรฉcennie.
- C'est un langage concis et puissant, capable d'รฉvoluer rapidement en fonction des besoins de ses utilisateurs.
- Il est orientรฉ objet et comprend de nombreuses fonctionnalitรฉs de programmation fonctionnelle, offrant aux dรฉveloppeurs une grande flexibilitรฉ dans la maniรจre dont ils รฉcrivent le code.
- Scala propose Duck Typing par types structurels.
- Il contient moins de texte standard que Java.
- Les frameworks Lift et Play, รฉcrits en Scala, continuent de mรปrir et de gagner en popularitรฉ.
Comment installer Scala
Pour commencer ร รฉcrire des programmes Scala, vous devez l'installer sur votre ordinateur. Pour ce faire, rendez-vous sur le site officiel ร l'adresse suivante : https://www.scala-lang.org/download/ pour tรฉlรฉcharger la derniรจre version de Scala.
En suivant le lien, deux options d'installation de Scala vous sont proposรฉes. Pour ce tutoriel Scala, nous utiliseronsโฆ IntelliJ IDEA, qui offre une excellente prise en charge de Scala prรชte ร l'emploi.
Une fois que vous aurez cliquรฉ sur le lien de tรฉlรฉchargement, vous trouverez deux รฉditions de l'IDE IntelliJ.
Pour ce tutoriel Scala, nous tรฉlรฉchargerons l'รฉdition Community, qui est gratuite et comprend tout ce dont vous avez besoin pour รฉcrire des programmes Scala.
รtape 1) Sรฉlectionnez l'รฉdition communautaire.
Sur la page, cliquez sur le menu dรฉroulant ยซ รdition communautaire ยป.
Il offre la possibilitรฉ de tรฉlรฉcharger l'IDE IntelliJ avec JBR, qui contient une implรฉmentation JDK (Java Kit de dรฉveloppement) tel qu'OpenJDK dont Scala a besoin pour compiler et exรฉcuter le code.
รtape 2) Lancez l'installation.
Une fois IntelliJ tรฉlรฉchargรฉ, double-cliquez sur le fichier d'installation et suivez l'assistant ร l'รฉcran.
รtape 3) Sรฉlectionnez un emplacement.
Choisissez un emplacement pour installer l'EDI.
Si vous n'avez pas tรฉlรฉchargรฉ le pack contenant le JDK, le programme d'installation vous invite tout de mรชme ร ajouter le JDK via une case ร cocher lors de l'installation.
รtape 4) Cliquez sur Suivant.
Laissez les autres paramรจtres par dรฉfaut tels quels et cliquez sur Suivant.
Programme Scala Hello World
รtape 5) Cliquez sur l'icรดne de dรฉmarrage.
Une fois l'installation terminรฉe, lancez l'IDE IntelliJ en cliquant sur son icรดne de dรฉmarrage dans le menu Dรฉmarrer, comme pour une application classique.
Vous devez encore ajouter le plugin Scala ร IntelliJ. Cliquez sur le menu dรฉroulant ยซ Configurer ยป en bas ร droite de lโรฉcran et sรฉlectionnez lโoption ยซ Plugins ยป.
Dans l'onglet Marketplace, recherchez Scala. Le plugin apparaรฎt en premier rรฉsultat sous l'รฉtiquette Langages.
รtape 6) Installez le plugin.
Cliquez sur Installer pour lancer le tรฉlรฉchargement du plugin Scala.
รtape 7) Redรฉmarrez l'IDE.
Une fois le tรฉlรฉchargement terminรฉ, vous serez invitรฉ ร redรฉmarrer l'IDE pour que le plugin installรฉ puisse commencer ร fonctionner.
Aprรจs le redรฉmarrage, vous revenez ร la mรชme page qu'auparavant, mais le plugin Scala est dรฉsormais installรฉ et prรชt ร l'emploi.
รtape 8) Sรฉlectionnez ยซ Crรฉer un projet ยป, ce qui vous mรจnera ร une page oรน vous pourrez choisir la langue du projet.
รtape 9) Choisissez Scala en cochant la case Scala et cliquez sur Suivant.
รtape 10) Choisissez un emplacement pour enregistrer le fichier de projet et donnez un nom au projet.
Si le rรฉpertoire n'existe pas, IntelliJ vous demandera l'autorisation de le crรฉer. Acceptez et cliquez sur Terminer. Vous serez alors redirigรฉ vers votre projet Scala, qui ne contient actuellement aucun code Scala.
Le chargement des index peut prendre un certain temps ; ne vous inquiรฉtez donc pas si vous ne pouvez pas interagir avec lโIDE โโpendant lโaffichage de la barre de progression en bas de lโรฉcran. LโIDE charge les fichiers nรฉcessaires ร lโexรฉcution de Scala et ร la saisie semi-automatique.
รtape 11) Cliquez sur l'onglet Projet ร gauche de l'IDE et dรฉveloppez-le pour afficher le contenu du projet.
ร ce stade, le projet est vide et ne contient qu'un dossier .idea et un fichier hello-world.iml gรฉnรฉrรฉ par l'IDE. Le dossier src, qui contient le code source du projet, est l'รฉlรฉment important. C'est lร que vous crรฉez votre premier fichier Scala.
รtape 12) Faites un clic droit sur src pour ouvrir un menu et crรฉer un nouveau fichier Scala.
Choisissez un nom pour le fichier. Pour ce tutoriel Scala, utilisez hello, puis choisissez Objet dans la liste dรฉroulante pour le type de contenu du fichier Scala.
Une fois cela fait, vous obtenez un fichier Scala contenant un objet singleton que vous utiliserez pour exรฉcuter le code.
Maintenant que vous avez un fichier Scala contenant un objet Hello, รฉcrivez votre premier programme en รฉtendant l'objet que vous avez crรฉรฉ ร l'aide du mot-clรฉ App.
L'extension de l'objet avec App indique au compilateur quel code exรฉcuter au dรฉmarrage du programme. Immรฉdiatement aprรจs l'extension de App, une flรจche verte apparaรฎt ร gauche, indiquant que le programme est dรฉsormais exรฉcutable.
Dans l'objet Hello, รฉcrivez la fonction println() pour afficher le texte dans la console. Exรฉcutez le programme en cliquant sur la flรจche verte.
Cliquer sur la flรจche permet de sรฉlectionner l'option ยซ Exรฉcuter Hello ยป. En la sรฉlectionnant, le code est compilรฉ et, aprรจs quelques secondes, le rรฉsultat du programme apparaรฎt dans la console IntelliJ.
Vous avez maintenant installรฉ Scala avec succรจs et exรฉcutรฉ votre premier programme.
Ce que vous pouvez faire avec Scala
Scala est largement utilisรฉ dans de nombreux domaines grรขce ร sa flexibilitรฉ et son interopรฉrabilitรฉ avec la JVM. Voici quelques cas d'utilisation courants :
- Dรฉveloppement web frontend avec ScalaJS.
- Dรฉveloppement mobile pour Android et iOS avec Scala Native.
- Bibliothรจques cรดtรฉ serveur telles que HTTP4S, Akka-Http et le framework Play.
- Applications de l'Internet des objets (IoT).
- Dรฉveloppement de jeu.
- Traitement automatique du langage naturel ร l'aide de la suite de bibliothรจques ScalaNLP.
- Pratiquer conjointement des techniques avancรฉes telles que la programmation fonctionnelle et la programmation orientรฉe objet.
- Applications de communication hautement concurrentes utilisant des acteurs, une bibliothรจque pour la JVM inspirรฉe d'Erlang.
- L'apprentissage automatique utilise des bibliothรจques comme Figaro pour la programmation probabiliste et Apache. Spark pour le traitement de donnรฉes ร grande รฉchelle.
Fonctions anonymes
Le langage Scala prend en charge les fonctions anonymes, รฉgalement appelรฉes littรฉraux de fonctionComme Scala est un langage fonctionnel, les dรฉveloppeurs dรฉcomposent souvent les problรจmes complexes en de nombreuses petites tรขches et crรฉent de nombreuses fonctions. Pour faciliter cela, Scala permet aux fonctions d'รชtre instanciรฉ sans nomVous pouvez les affecter directement ร des variables ou ร des dรฉfinitions en utilisant def, comme le montre l'exemple Scala suivant :
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n * 3
Vous pouvez ensuite les utiliser comme des fonctions classiques en leur passant des paramรจtres :
multiplyByTwo(3) //6 multiplyByThree(4) //12
Ces mรฉthodes s'avรจrent pratiques pour obtenir un code clair et concis. Les fonctions anonymes sont utiles pour dรฉfinir des mรฉthodes courtes, ne nรฉcessitant que peu de code. Elles sont trรจs simples ร crรฉer et ne requiรจrent aucune formalitรฉ particuliรจre.
Ces mรฉthodes ne se limitent pas aux fonctions avec arguments et peuvent รชtre utilisรฉes pour instancier des mรฉthodes qui ne prennent aucun argument.
val sayHello = () => { println("hello") }
La plupart de ces fonctions anonymes sont utilisรฉes dans d'autres parties du code oรน l'on a besoin d'une fonction rapide. C'est pourquoi on les appelle aussiโฆ fonctions en ligneL'utilisation de fonctions anonymes est une pratique courante qui apparaรฎt dans toute la bibliothรจque de collections pour effectuer rapidement des actions sur une collection.
Par exemple, la mรฉthode filter prend une fonction en ligne pour crรฉer une autre collection ne contenant que les รฉlรฉments qui rรฉpondent aux critรจres dรฉfinis dans la fonction anonyme.
val myList = List(1,2,3,4,5,6,7) val myEvenList = myList.filter((n: Int) => n % 2 == 0) //List(2,4,6) val myOddList = myList.filter((n:Int) => n % 2 != 0) //List(1,3,5,7)
Ici, les fonctions anonymes vรฉrifient si la valeur de la liste est paire ou impaire et renvoient l'รฉlรฉment correspondant.
//the one checking that the value is even (n: Int) => n % 2 == 0 //the one checking that the value is odd (n:Int) => n % 2 != 0
En Scala, il est รฉgalement possible d'utiliser des caractรจres gรฉnรฉriques lorsque le paramรจtre de la fonction anonyme n'est pas nommรฉ. Par exemple :
var timesTwo = (_:Int) * 2 timesTwo(5) //10
Dans ce cas, vous ne nommez pas le paramรจtre. Le trait de soulignement est utilisรฉ pour le reprรฉsenter.
รvaluation paresseuse
La plupart des langages รฉvaluent les variables et les paramรจtres de fonction sรฉquentiellement, les uns aprรจs les autres. En Scala, le mot-clรฉ lazy permet de gรฉrer les valeurs que vous ne souhaitez pas รฉvaluer tant qu'elles ne sont pas rรฉfรฉrencรฉes.
Une variable dรฉclarรฉe comme paresseuse n'est pas รฉvaluรฉe ร l'endroit oรน elle est dรฉfinie ; ce phรฉnomรจne est communรฉment appelรฉ รฉvaluation immรฉdiate. Elle n'est รฉvaluรฉe que lorsqu'elle est rรฉfรฉrencรฉe ultรฉrieurement dans le code.
Cela peut s'avรฉrer utile lorsque l'รฉvaluation d'une valeur nรฉcessiterait un calcul coรปteux. Si la valeur n'est pas toujours nรฉcessaire, vous รฉvitez un calcul onรฉreux susceptible de ralentir le logiciel en rendant la variable paresseuse.
lazy val myExpensiveValue = expensiveComputation def runMethod() = { if(settings == true) { use(myExpensiveValue) } else { use(otherValue) } }
Ce n'est pas le seul cas d'utilisation des variables paresseuses. Elles permettent รฉgalement de gรฉrer les dรฉpendances circulaires dans le code.
Si l'indicateur de configuration est dรฉsactivรฉ, vous n'avez pas besoin d'utiliser myExpensiveValue, ce qui vous รฉvite un calcul coรปteux. Cela contribue ร garantir une expรฉrience utilisateur optimale, car les ressources ne sont pas gaspillรฉes pour des valeurs qui ne sont jamais lues.
L'รฉvaluation paresseuse est รฉgalement utile pour les arguments de fonction, qui ne sont utilisรฉs que lorsqu'ils sont rรฉfรฉrencรฉs ร l'intรฉrieur de la fonction. Ce concept est appelรฉ paramรจtres par leur nom.
def sometimesUsedString(someValue:String, defaultValue: => String) = { if(someValue != null) { use(defaultValue) } else { use(someValue) } }
De nombreux langages utilisent l'approche d'appel par valeur pour l'รฉvaluation des arguments. Un paramรจtre passรฉ par son nom n'est รฉvaluรฉ que lorsque cela est nรฉcessaire dans le corps de la fonction. Une fois รฉvaluรฉe, sa valeur est stockรฉe et peut รชtre rรฉutilisรฉe ultรฉrieurement sans nouvelle รฉvaluation ; ce concept est appelรฉ mรฉmoรฏsation.
Infรฉrence de type
En Scala, il n'est pas nรฉcessaire de dรฉclarer le type de chaque variable crรฉรฉe, car le compilateur Scala peut l'infรฉrer ร partir du membre droit d'une expression. Cela permet d'obtenir un code plus concis et d'รฉviter d'รฉcrire du code rรฉpรฉtitif lorsque le type attendu est รฉvident.
var first:String = "Hello, " var second:String = "World" var third = first + second //the compiler infers that third is of type String
Fonction d'ordre supรฉrieur
Une fonction d'ordre supรฉrieur est une fonction qui peut prendre des fonctions comme arguments et renvoyer une fonction. En Scala, les fonctions sont considรฉrรฉes comme des objets de premiรจre classe. Cette approche offre une grande flexibilitรฉ dans la conception de programmes. Il est possible de crรฉer des fonctions dynamiquement et d'alimenter dynamiquement d'autres fonctions avec des fonctionnalitรฉs.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int = { myMathFunction(n) }
Dans la fonction ci-dessus, vous transmettez un Int et une fonction qui prend un Int et renvoie un IntVous pouvez passer en paramรจtre n'importe quelle fonction possรฉdant cette signature. Par signature, nous entendons les entrรฉes et sorties d'une fonction. Une signature de Int => Int signifie qu'une fonction prend un Int en entrรฉe et renvoie un Int en sortie.
Une signature de () => Int Cela signifie qu'une fonction ne prend aucun argument en entrรฉe et renvoie un entier (Int) en sortie. Un exemple de telle fonction est celle qui gรฉnรจre un entier alรฉatoire.
def generateRandomInt() = { return scala.util.Random.nextInt() }
La fonction ci-dessus possรจde une signature () => Int.
Une fonction peut รฉgalement avoir une signature () => UnitCela signifie que la fonction ne prend aucun argument et ne renvoie aucun type. Elle peut en revanche modifier un รฉtat ou exรฉcuter une action prรฉdรฉterminรฉe.
Ces mรฉthodes sont dรฉconseillรฉes car elles peuvent agir comme une boรฎte noire et affecter le systรจme de maniรจre imprรฉvisible. Elles sont รฉgalement plus difficiles ร tester. Dรฉfinir explicitement les types d'entrรฉe et de sortie permet de comprendre le fonctionnement de la fonction.
Une fonction d'ordre supรฉrieur peut รฉgalement renvoyer une fonction. Par exemple, vous pourriez crรฉer une mรฉthode qui renvoie une fonction d'รฉlรฉvation, c'est-ร -dire une fonction qui prend un nombre et lui applique une puissance.
def powerByFunction(n:Int): Int=>Int = { return (x:Int) => scala.math.pow(x,n).toInt }
La fonction ci-dessus prend un Int. Son type de retour est une fonction anonyme qui prend un Int. x et l'utilise comme argument de la fonction puissance.
Curry
En Scala, il est possible de transformer une fonction prenant deux arguments en une fonction n'en prenant qu'un seul ร la fois. Lorsqu'un argument est passรฉ, il est appliquรฉ partiellement, et la fonction obtenue prend l'argument restant pour complรฉter l'appel. La curryfication permet de construire des fonctions en ajoutant progressivement des arguments.
Ceci est utile pour crรฉer des fonctions dynamiquement avant mรชme de disposer d'un ensemble complet d'arguments.
def multiplyTwoNumbers(n:Int)(m:Int): Int = { return n * m }
Si vous avez besoin d'une fonction qui multiplie par un nombre spรฉcifique, il n'est pas nรฉcessaire de crรฉer une autre mรฉthode de multiplication. Vous pouvez appliquer un argument ร la fonction curryfiรฉe et rรฉutiliser le rรฉsultat :
def multiplyTwoNumbers(n:Int)(m:Int): Int = { return n * m } var multiplyByFive = multiplyTwoNumbers(5) _ multiplyByFive(4) //returns 20
Correspondance de motif
Scala possรจde un mรฉcanisme intรฉgrรฉ puissant qui vous aide ร vรฉrifier si une variable correspond ร certains critรจres, un peu comme une instruction switch. Java ou une chaรฎne d'instructions if/else. Le langage prend en charge le filtrage par motif, que vous pouvez utiliser pour vรฉrifier si une variable est d'un type particulier. Le filtrage par motif en Scala est puissant et peut dรฉstructurer les composants qui ont un unapply mรฉthode permettant d'obtenir directement les champs qui vous intรฉressent ร partir de la variable mise en correspondance.
Le filtrage par motif de Scala offre รฉgalement une syntaxe plus agrรฉable qu'une instruction switch.
myItem match { case true => //do something case false => //do something else case _ => //if none of the above do this by default }
Vous comparez la variable ร un ensemble d'options. Lorsque la variable correspond aux critรจres, l'expression situรฉe ร droite de la flรจche (=>) est รฉvaluรฉe et le rรฉsultat de la correspondance est renvoyรฉ.
Le caractรจre de soulignement permet de repรฉrer les cas qui ne sont pas pris en compte dans le code, reproduisant ainsi le comportement du cas par dรฉfaut dans une instruction switch.
class Animal(var legs:Int, var sound:String) class Furniture(var legs:Int, var color:Int, var woodType:String) myItem match { case myItem:Animal => //do something case myItem:Furniture => //do something else case _ => //unknown type, do something else }
Dans le code ci-dessus, vous pouvez dรฉtecter le type de myItem variable et, sur cette base, se ramifier vers un code spรฉcifique.
La correspondance de modรจles vรฉrifie si la variable correspond ร chaque cas dans l'ordre.
Le caractรจre de soulignement sert d'espace rรฉservรฉ et correspond ร toute condition que les autres instructions case ne couvrent pas. Vous prenez une variable myItem et appelez le match mรฉthode.
- Vรฉrifier si
myItemistrueet exรฉcutez la logique ร droite de la grosse flรจche ยซ => ยป. - Utilisez le trait de soulignement pour faire correspondre tout ce qui ne correspond ร aucune des instructions case dรฉfinies dans le code.
Avec les classes de cas, vous pouvez dรฉstructurer la classe pour, par exemple,tracchamps t ร l'intรฉrieur de l'objet.
En utilisant le sealed En utilisant le mot-clรฉ `--class` pour dรฉfinir des classes, vous bรฉnรฉficiez de l'avantage que le compilateur vรฉrifie exhaustivement les cas que vous essayez de faire correspondre et vous avertit si vous oubliez d'en traiter un.
Immutabilitรฉ
Il est possible de crรฉer des valeurs qui ne peuvent pas รชtre modifiรฉes par d'autres fonctions en Scala en utilisant val mot-clรฉ. Ceci est rรฉalisรฉ dans Java En utilisant le final mot-clรฉ. En Scala, vous utilisez un val lors de la crรฉation d'une variable au lieu de var, qui est l'alternative pour les variables mutables.
Une variable dรฉfinie ร l'aide de val Le mot-clรฉ est en lecture seule, tandis que celui-ci est dรฉfini avec var peuvent รชtre lues et modifiรฉes ultรฉrieurement par d'autres fonctions ou par l'utilisateur dans le code.
var changeableVariable = 8 changeableVariable = 10 //the compiler does not complain, and the code compiles successfully println(changeableVariable) //10 val myNumber = 7 myNumber = 4 //this will not compile
Tentative d'attribution d'une valeur ร myNumber aprรจs l'avoir dรฉclarรฉ comme un val gรฉnรจre une erreur de compilation : ยซ rรฉaffectation ร val ยป.
Pourquoi utiliser l'Immuabilitรฉ ?
L'immuabilitรฉ empรชche les modifications inattendues des valeurs par le code et les autres programmeurs, ce qui pourrait entraรฎner des rรฉsultats imprรฉvisibles. Si les utilisateurs d'une valeur doivent la modifier, ils peuvent en crรฉer une copie. Ainsi, les bogues causรฉs par la modification simultanรฉe d'une mรชme variable par plusieurs acteurs sont รฉvitรฉs.
Classes et objets
Les objets sont des entitรฉs du monde rรฉel, et une classe est un modรจle qui dรฉfinit ces objets. Les classes possรจdent ร la fois un รฉtat et des comportements. L'รฉtat peut รชtre constituรฉ de valeurs ou de variables. Les comportements correspondent aux mรฉthodes en Scala.
La section suivante explique comment dรฉfinir une classe, l'instancier et l'utiliser en Scala.
Voici une classe appelรฉe Rectangle qui possรจde deux valeurs et deux fonctions. Vous pouvez รฉgalement utiliser les paramรจtres. l et b directement en tant que champs dans le programme. Vous avez un objet qui possรจde une mรฉthode principale et qui instancie la classe avec deux valeurs.
Exemple :
class Rectangle(l: Int, b: Int) { val length: Int = l val breadth: Int = b def getArea: Int = l * b override def toString = s"This is a rectangle with length $length and breadth $breadth" } object RectObject { def main(args: Array[String]) { val rect = new Rectangle(4, 5) println(rect.toString) println(rect.getArea) } }
En Scala, tous les champs et mรฉthodes sont publics par dรฉfaut. Il est essentiel de les utiliser. override car toString est dรฉjร dรฉfini pour chaque objet en Scala.
Droit des successions
Scala possรจde plusieurs types d'hรฉritage (simple, multiniveau, multiple, hiรฉrarchique et hybride) qui partagent de nombreux points communs avec les formes traditionnelles que l'on trouve dans JavaVous pouvez hรฉriter ร la fois des classes et des traits. Vous hรฉritez des membres d'une classe dans une autre classe ร l'aide du mot-clรฉ `@hit`. extendsCela permet la rรฉutilisation.
Il est possible d'hรฉriter d'une seule classe ou de plusieurs classes. Il est รฉgalement possible d'hรฉriter de sous-classes qui possรจdent elles-mรชmes leurs propres superclasses, crรฉant ainsi une hiรฉrarchie d'hรฉritage.
Dans l'exemple Scala ci-dessous, la classe de base est Circle, et la classe dรฉrivรฉe est SphereUn cercle possรจde une valeur appelรฉe rayon, hรฉritรฉe par la classe Sphere. La mรฉthode calcArea est remplacรฉ ร l'aide du mot-clรฉ override.
Exemple :
class Circle { val radius = 5 def calcArea = { println(radius * radius) } } class Sphere extends Circle { override def calcArea = { println(radius * radius * radius) } } object SphereObject { def main(args : Array[String]) { new Sphere().calcArea } }
Abdostracproduction
En Scala, vous pouvez crรฉer des abstracmรฉthodes t et champs membres utilisant abstracclasses et caractรฉristiques. ร l'intรฉrieur des abdominauxtract classes et traits, vous pouvez dรฉfinir abstracchamps t sans les implรฉmenter.
Exemple :
trait MakesSound { var nameOfSound:String def sound():String } abstract class HasLegs(var legs:Int) { val creatureName:String def printLegs():String = { return s"$creatureName has this number of legs: $legs" } }
Ces champs sont implรฉmentรฉs par les classes qui รฉtendent le trait ou l'abstracclasse t. Vous pouvez utiliser des traits pour crรฉer des classes.tracdรฉfinir ce qu'une application doit faire, puis implรฉmenter ces mรฉthodes ultรฉrieurement.
trait DatabaseService { def addItemName(itemName:String) def removeItem(itemId:Int) def updateItem(itemId:Int, newItemName:String) }
Ainsi, vous pouvez planifier l'apparence d'une application sans implรฉmenter les mรฉthodes.ping vous imaginez comment les diffรฉrentes mรฉthodes apparaรฎtront. Cela suit un modรจle connu sous le nom de programmation abstracdes questions plutรดt que la mise en ลuvre concrรจte.
Une classe prรฉcรฉdรฉe du abstract Le mot-clรฉ peut contenir ร la fois abstract et non-abstracmรฉthodes t. Cependant, l'hรฉritage multiple n'est pas pris en charge dans abstracclasses t, vous ne pouvez donc รฉtendre qu'un seul abstracclasse t.
Objets Singleton
Un singleton est une classe instanciรฉe une seule fois dans un programme. Il provient d'un modรจle de programmation populaire et utile appelรฉ ยซ modรจle singleton ยป. Il est particuliรจrement utile pour crรฉer des instances destinรฉes ร avoir une longue durรฉe de vie et ร รชtre frรฉquemment utilisรฉes dans le programme, lorsque l'รฉtat est essentiel ร la coordination des รฉvรฉnements au sein du systรจme. Crรฉer une telle classe en Scala est simple, car Scala offre un moyen facile de crรฉer des singletons. object mot-clรฉ.
object UserProfile { var userName = "" var isLoggedIn:Boolean = false }
Vous pouvez ensuite faire rรฉfรฉrence ร cet objet dans tout le programme, avec la garantie que toutes les parties du programme verront les mรชmes donnรฉes, car il n'existe qu'une seule instance de celui-ci.
def getLoggedInStatus():Boolean = { return UserProfile.isLoggedIn } def changeLoggedInStatus():Boolean = { UserProfile.isLoggedIn = !UserProfile.isLoggedIn return UserProfile.isLoggedIn }
Le concept de membres statiques n'existe pas en Scala, c'est pourquoi on utilise des objets singleton qui se comportent comme des membres statiques d'une classe.
Classes implicites
Les classes implicites sont une fonctionnalitรฉ ajoutรฉe dans la version 2.10 et sont principalement utilisรฉes pour ajouter de nouvelles fonctionnalitรฉs aux classes fermรฉes existantes.
Le implicit Le mot-clรฉ doit รชtre dรฉfini dans une classe, un objet ou un trait. Le constructeur principal d'une classe implicite doit avoir exactement un argument dans sa premiรจre liste de paramรจtres. Il peut รฉgalement inclure une liste de paramรจtres implicites supplรฉmentaires.
Dans l'exemple Scala ci-dessous, une nouvelle fonctionnalitรฉ permettant de remplacer les voyelles d'une chaรฎne de caractรจres par * a รฉtรฉ ajoutรฉe.
object StringUtil { implicit class StringEnhancer(str: String) { def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*") } }
Vous devez importer la classe implicite dans la classe oรน vous l'utilisez.
import StringUtil.StringEnhancer object ImplicitEx extends App { val msg = "This is Guru99!" println(msg.replaceVowelWithStar) }
Programmation orientรฉe objet (POO) vs. Programmation fonctionnelle (PF)
En POO, les programmes sont construits par groupesping Les donnรฉes et les fonctions qui les manipulent sont organisรฉes en unitรฉs hautement interconnectรฉes. Les objets contiennent leurs donnรฉes dans des champs et les mรฉthodes opรจrent sur ces champs. Dans ce style de programmation, les principaux รฉlรฉments sontโฆtracLa finalitรฉ rรฉside dans les donnรฉes, car les mรฉthodes crรฉรฉes sont destinรฉes ร fonctionner sur ces donnรฉes.
Programmation fonctionnelleEn revanche, elle sรฉpare les donnรฉes et les fonctions qui les manipulent. Cela permet aux dรฉveloppeurs de traiter les fonctions comme des entitรฉs absolues.traction et force motrice lors de la modรฉlisation des programmes.
Scala permet la programmation fonctionnelle en traitant les fonctions comme des objets de premiรจre classe, autorisant ainsi leur passage en paramรจtre ร d'autres fonctions et leur retour en paramรจtre. La combinaison de ces deux paradigmes fait de Scala un excellent choix pour le dรฉveloppement de logiciels complexes dans des secteurs tels que la science des donnรฉes.
Frameworks importants sur Scala
Voici quelques frameworks importants pour Scala :
- JOUER est un framework d'application Web open source qui utilise Architecture MVCSorti en 2007 et dรฉsormais sous licence Apache, il est devenu l'un des frameworks les plus populaires sur GitHub dรจs 2013. Des entreprises comme LinkedIn, WalmartSamsung et Eero utilisent ce framework.
- Hauteur de levage Lift est un autre framework web gratuit รฉcrit en Scala et lancรฉ en 2007. Foursquare utilise le framework Lift, un framework performant et rapide ร mettre en ลuvre.
- Akka fournit une boรฎte ร outils pour la crรฉation d'applications pilotรฉes par messages hautement concurrentes, distribuรฉes et rรฉsilientes sur la JVM.
- Chats est une bibliothรจque qui fournit des abstractions pour la programmation fonctionnelle.
- Spark est un moteur d'analyse unifiรฉ pour le traitement de donnรฉes ร grande รฉchelle, largement utilisรฉ dans les flux de travail de big data et d'apprentissage automatique.
Prise en charge de la concurrence
- Les valeurs en Scala sont immuables par dรฉfaut, ce qui le rend trรจs adaptable aux environnements concurrents.
- Scala possรจde de nombreuses caractรฉristiques qui en font un langage idรฉal pour les applications concurrentes.
- Futures and Promises facilite le traitement des donnรฉes de maniรจre asynchrone, prenant ainsi en charge le parallรฉlisme.
- Akka est une boรฎte ร outils qui utilise le modรจle de concurrence Actor. Les acteurs agissent lorsqu'ils reรงoivent des messages.
- Concurrence utilisant les threads de Java est รฉgalement pris en charge en Scala.
- Le traitement de flux est une autre fonctionnalitรฉ remarquable qui permet un traitement continu et en temps rรฉel des donnรฉes.
Scala possรจde certaines des meilleures bibliothรจques de concurrence du marchรฉ. Java รฉcosystรจme :
- Originaire Java threads.
- Fibres issues de bibliothรจques comme Vertx.
- ZIO, une bibliothรจque qui possรจde des primitives permettant de gรฉrer la concurrence et le calcul asynchrone.
- Mรฉmoire transactionnelle logicielle (STM) pour les transactions.
- Future, qui est intรฉgrรฉ au langage Scala.
Java contre Scala
Voici les principaux diffรฉrences entre Java et Scala.
| Scala | Java |
|---|---|
| Plus compact et concis. | Des blocs de code relativement plus importants. |
| Conรงu et dรฉveloppรฉ pour รชtre ร la fois orientรฉ objet et fonctionnel. Prend en charge un large รฉventail de fonctionnalitรฉs de programmation fonctionnelle telles que la concurrence et l'immuabilitรฉ. | Initialement conรงu comme un langage orientรฉ objet, il a commencรฉ ร prendre en charge les fonctionnalitรฉs de programmation fonctionnelle dans ses versions rรฉcentes. Il reste cependant moins performant que Scala dans ce domaine. |
| Utilise le modรจle d'acteurs pour la prise en charge de la concurrence. | Utilise le modรจle conventionnel basรฉ sur les threads pour la concurrence. |
| Compatible avec des frameworks tels que Play et Lift. | Compatible avec Spring, Grails et bien d'autres. |
| Prend en charge l'รฉvaluation paresseuse. | Ne prend pas en charge nativement l'รฉvaluation paresseuse. |
| Aucun membre statique. | Contient des membres statiques. |
| Prend en charge la surcharge des opรฉrateurs. | Ne prend pas en charge la surcharge des opรฉrateurs. |
| La compilation du code source est relativement lente. | La compilation du code source est plus rapide qu'avec Scala. |
| Les traits agissent comme Java 8 interfaces. | Java 8 interfaces tentent de combler le fossรฉ entre les classes et les interfaces. |
| Une rรฉรฉcriture est parfois nรฉcessaire lors de la mise ร niveau des versions. | La rรฉรฉcriture n'est gรฉnรฉralement pas nรฉcessaire entre les versions. |
| La sรฉcuritรฉ des types offre une grande fiabilitรฉ du code, mais ne garantit pas l'absence absolue de bogues. | Forte statique typing permet de rรฉduire de nombreux dรฉfauts d'exรฉcution. |
| Prรฉsente certaines limitations de compatibilitรฉ ascendante entre les versions majeures. | Forte rรฉtrocompatibilitรฉ ร long terme. |
| OperaLes appels de mรฉthode sont traitรฉs comme des appels de mรฉthode. | OperaLes appels de mรฉthode (tors) constituent une syntaxe spรฉciale et ne sont pas des appels de mรฉthode. |
| Prend en charge l'hรฉritage multiple via les traits. | Ne prend pas en charge l'hรฉritage multiple par classes ; utilise des interfaces ร la place. |
| Code est rรฉdigรฉ sous une forme compacte. | Code est rรฉdigรฉ sous une forme plus verbeuse. |
| Scala ne contient pas le mot-clรฉ static. | Java contient le mot clรฉ static. |






















