Tutoriel Scala

Rรฉsumรฉ du didacticiel Scala

Ce didacticiel Scala couvre tous les aspects et sujets de Scala. Vous apprendrez tous les principes fondamentaux ร  partir de zรฉro, comme Qu'est-ce que Scala, le processus d'installation de Scala, les programmes Scala, les fonctions Scala, l'รฉvaluation paresseuse, l'interface de type, les classes et les objets, l'hรฉritage, les abstractions, Java et les diffรฉrences d'รฉchelle, etc.

Qu'est-ce que Scala ?

Scala est un langage de programmation typรฉ statiquement qui intรจgre ร  la fois une programmation fonctionnelle et orientรฉe objet pour augmenter l'รฉvolutivitรฉ des applications. Scala fonctionne principalement sur la plate-forme JVM et peut รฉgalement รชtre utilisรฉ pour รฉcrire des logiciels pour les plates-formes natives ร  l'aide de Scala-Native et Javascรฉnario exรฉcutions via ScalaJs.

Scala est un langage รฉvolutif utilisรฉ pour รฉcrire des logiciels pour plusieurs plates-formes. C'est pourquoi il a reรงu le nom de ยซ Scala ยป. Ce langage est destinรฉ ร  rรฉsoudre les problรจmes de Java tout en รฉtant plus concis. Initialement conรงu par Martin Odersky, il a รฉtรฉ publiรฉ en 2003.

Pourquoi apprendre Scala

Voici les principales raisons dโ€™apprendre le langage de programmation Scala :

  • Scala est facile ร  apprendre pour les programmeurs orientรฉs objet, Java dรฉveloppeurs. Cโ€™est devenu lโ€™une des langues les plus populaires ces derniรจres annรฉes.
  • Scala offre des fonctions de premiรจre classe aux utilisateurs
  • Scala peut รชtre exรฉcutรฉ sur JVM, ouvrant ainsi la voie ร  lโ€™interopรฉrabilitรฉ avec dโ€™autres langages.
  • Il est conรงu pour les applications simultanรฉes, distribuรฉes et rรฉsilientes basรฉes sur les messages. C'est l'une des langues les plus exigeantes de cette dรฉcennie.
  • Il sโ€™agit dโ€™un langage concis et puissant qui peut rapidement รฉvoluer en fonction de la demande de ses utilisateurs.
  • Il est orientรฉ objet et possรจde de nombreuses fonctionnalitรฉs de programmation fonctionnelles offrant une grande flexibilitรฉ aux dรฉveloppeurs pour coder comme ils le souhaitent.
  • Scala propose de nombreux types de canards
  • Il y a moins de passe-partout si vous venez de Java
  • Les frameworks Lift et Play รฉcrits en Scala sont dans la courbe de croissance.

Comment installer Scala

Pour commencer ร  รฉcrire des programmes Scala, vous devez l'installer sur votre ordinateur. Pour ce faire, vous devrez visiter leur site https://www.scala-lang.org/download/ afin de tรฉlรฉcharger la derniรจre version de Scala.

En suivant le lien, nous sommes dirigรฉs vers deux options que nous pouvons choisir pour installer Scala sur nos machines. Pour ce tutoriel Scala, nous allons tรฉlรฉcharger le IntelliJ IDEA.

Comment installer Scala

Une fois que vous aurez visitรฉ le lien de tรฉlรฉchargement, vous trouverez deux versions de l'IDE IntelliJ.

Pour ce didacticiel Scala, nous tรฉlรฉchargerons l'รฉdition communautaire, qui est gratuite et contient tout ce dont vous avez besoin pour รฉcrire des programmes Scala.

Comment installer Scala

ร‰tape 1) Sรฉlectionnez l'รฉdition communautaire
Sur la page, cliquez sur le menu dรฉroulant de l'รฉdition communautaire.

Il nous prรฉsente une option pour tรฉlรฉcharger l'IDE IntelliJ avec JBR qui contient une implรฉmentation JDK (Java Kit de dรฉveloppement) OpenJDK dont Scala a besoin pour compiler et exรฉcuter le code.

Comment installer Scala

ร‰tape 2) Lancez l'installation
Une fois que vous avez tรฉlรฉchargรฉ IntelliJ, double-cliquez dessus pour exรฉcuter l'assistant d'installation et suivez la boรฎte de dialogue.

Comment installer Scala

ร‰tape 3) Choisissez un emplacement
Choisissez un emplacement pour installer l'EDI.

Comment installer Scala

Si par hasard vous n'avez pas tรฉlรฉchargรฉ celui avec le JDK, nous recevons toujours une invite oรน nous pouvons vรฉrifier pour le tรฉlรฉcharger en cochant la case.

Comment installer Scala

ร‰tape 4) Cliquez sur suivant
Laissez les autres valeurs par dรฉfaut telles quelles et cliquez sur Suivant.

Comment installer Scala

ร‰tape 5) Cliquez sur l'icรดne de dรฉmarrage
Une fois l'installation terminรฉe, exรฉcutez l'IDE IntelliJ en cliquant sur son icรดne de dรฉmarrage dans le menu de dรฉmarrage comme une application classique.

Comment installer Scala

Vous devez encore passer par une รฉtape supplรฉmentaire consistant ร  ajouter le plugin Scala ร  IntelliJ ; pour ce faire, cliquez sur le menu dรฉroulant du menu de configuration situรฉ en bas ร  droite de l'รฉcran et sรฉlectionnez l'option plugin.

Comment installer Scala

Comment installer Scala

Dans l'onglet Marketplace, une recherche sur Scala prรฉsentera le plugin comme premier rรฉsultat sous la balise Languages.

ร‰tape 6) Installer le plugin
Cliquez sur Installer, ce qui amรจnera le plugin ร  commencer le tรฉlรฉchargement.

Comment installer Scala

ร‰tape 7) Redรฉmarrez l'IDE
Une fois le tรฉlรฉchargement terminรฉ, vous serez invitรฉ ร  redรฉmarrer l'IDE afin que le plugin installรฉ puisse commencer ร  fonctionner.

Comment installer Scala

Aprรจs le redรฉmarrage, vous vous retrouverez sur la mรชme page qu'avant lorsque nous avons exรฉcutรฉ l'EDI, mais cette fois-ci, nous avons dรฉjร  installรฉ le plugin Scala.

Programme Scala Hello World

ร‰tape 1) Sรฉlectionnez l'option Crรฉer un projet, qui nous mรจnera ร  une page oรน nous pourrons sรฉlectionner le type de langage que notre projet utilisera.

Programme Scala Hello World

ร‰tape 2) choisissez Scala en cochant la case Scala et cliquez sur suivant.

Programme Scala Hello World

ร‰tape 3) Sรฉlectionnez un emplacement pour enregistrer notre fichier de projets et donnez un nom ร  notre projet.

Programme Scala Hello World

Si le rรฉpertoire n'existe pas, IntelliJ nous demandera de nous demander l'autorisation de crรฉer le dossier. Acceptez et cliquez sur Terminer. Vous serez redirigรฉ vers votre projet Scala, qui ne contient actuellement aucun code Scala.

Le chargement de certains index prendra un certain temps, alors ne vous inquiรฉtez pas si vous ne parvenez pas ร  faire quoi que ce soit immรฉdiatement alors qu'il y a une barre de progression en bas de votre IDE, cela signifie simplement que votre IDE charge certains fichiers nรฉcessaires ร  l'exรฉcution de Scala et aide ร  la saisie semi-automatique de l'IDE.

ร‰tape 4) Ensuite, nous allons cliquer sur l'onglet projets ร  gauche de l'EDI et le dรฉvelopper pour pouvoir voir le contenu de notre projet.

Programme Scala Hello World

Pour le moment, le projet est vide et ne contient qu'un dossier .idea et un fichier hello-world.iml gรฉnรฉrรฉs par l'EDI. Notre point dโ€™intรฉrรชt est le dossier src. Src est l'endroit oรน nous stockons le code source de notre projet. C'est lร  que nous allons crรฉer notre premier fichier Scala.

ร‰tape 5) Faites un clic droit sur src pour ouvrir un menu permettant de crรฉer un nouveau fichier Scala.

Crรฉer un nouveau fichier Scala

Nous allons ensuite crรฉer un nom pour le fichier, dans ce didacticiel Scala, nous utiliserons hello puis choisirons dans une liste dรฉroulante ce qu'il faut mettre comme contenu du fichier Scala. Sรฉlectionnez ยซ Objet ยป

Programme Scala Hello World

Une fois cela fait, nous aurons un fichier Scala contenant un objet Singleton que nous utiliserons pour exรฉcuter notre code.

Programme Scala Hello World

Maintenant que vous disposez d'un fichier Scala avec un objet Hello. Vous รฉcrirez votre premier programme en รฉtendant l'objet que vous avez crรฉรฉ ร  l'aide du mot-clรฉ App.

L'extension de notre objet avec App indique au compilateur quel code exรฉcuter lorsqu'il dรฉmarre votre programme. Immรฉdiatement aprรจs l'extension de l'application, une flรจche verte apparaรฎt sur le cรดtรฉ gauche, indiquant que vous pouvez dรฉsormais exรฉcuter votre programme.

Programme Scala Hello World

Programme Scala Hello World

ร€ lโ€™intรฉrieur de lโ€™objet Hello, nous รฉcrivons une fonction println() qui est utilisรฉe pour imprimer le texte quโ€™il contient sur la console. Nous allons exรฉcuter notre code en cliquant sur la flรจche verte.

En cliquant sur la flรจche, nous obtenons l'option Exรฉcuter, bonjour, en cliquant dessus, notre code commencera ร  se compiler et aprรจs quelques secondes nous verrons les rรฉsultats de notre programme imprimรฉs depuis la console intรฉgrรฉe ร  l'IDE IntelliJ.

Programme Scala Hello World

Et voilร , nous avons installรฉ avec succรจs Scala et exรฉcutรฉ notre premier programme.

Ce que vous pouvez faire avec Scala

  • Dรฉveloppement web front-end avec ScalaJS
  • Dรฉveloppement mobile, les deux Android Dรฉveloppement et IOS โ€“ avec Scala Native
  • Bibliothรจques cรดtรฉ serveur comme HTTP4S, Akka-Http, Play Framework
  • Internet des objets utilisant
  • Dรฉveloppement de jeu
  • NLP โ€“ Traitement du langage naturel utilisant une suite de bibliothรจques ScalaNLP
  • Tester des techniques de programmation avancรฉes telles que la programmation fonctionnelle et la programmation orientรฉe objet
  • Construire une application de communication hautement concurrente en utilisant des acteurs, une bibliothรจque pour la JVM inspirรฉe d'Erlang
  • Utilisez-le pour l'apprentissage automatique en utilisant des bibliothรจques comme Figaro qui fait de la programmation probabiliste et Apache Spark qui

Fonctions anonymes

Le langage Scala possรจde des fonctions anonymes, รฉgalement appelรฉes littรฉraux de fonction. Scala รฉtant un langage fonctionnel, cela signifie souvent que les dรฉveloppeurs dรฉcomposent les gros problรจmes en plusieurs petites tรขches et crรฉent de nombreuses fonctions pour rรฉsoudre ces problรจmes. Pour faciliter la crรฉation de fonctions, Scala contient ces fonctions qui peuvent รชtre instanciรฉ sans nom. Nous pouvons les attribuer directement ร  des variables ou ร  des dรฉfinitions ยซ def ยป, comme le montre l'exemple Scala ci-dessous :

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n *3

Nous pouvons ensuite utiliser la maniรจre normale dont nous utilisons les fonctions en leur passant les paramรจtres suivants.

multiplyByTwo(3)

//6

multiplyByThree(4)

//12

Ces mรฉthodes sont utiles lorsque nous voulons avoir un code propre et concis. Nous pouvons utiliser des fonctions anonymes pour dรฉfinir des mรฉthodes qui ne sont pas volumineuses et ne nรฉcessitent pas beaucoup de code dans leur corps. Ils sont trรจs simples et ne nรฉcessitent pas de cรฉrรฉmonie pour รชtre crรฉรฉs.

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 de notre code oรน nous devons crรฉer une fonction rapide en place.

Une autre raison pour laquelle ces fonctions sont รฉgalement appelรฉes fonctions en ligne. L'utilisation de fonctions anonymes est un modรจle courant qui est largement utilisรฉ dans la bibliothรจque de collections pour effectuer des actions rapides sur une collection.

Par exemple, nous avons la mรฉthode filter qui prend une fonction en ligne/une fonction anonyme pour crรฉer une autre collection avec uniquement des รฉlรฉments qui rรฉpondent aux critรจres que nous dรฉfinissons 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 mรฉthodes que nous avons en tant que fonctions anonymes sont celles qui vรฉrifient si la valeur que nous obtenons de la liste est paire et impaire et renvoient l'รฉlรฉment.

//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

Dans Scala, il est รฉgalement possible d'utiliser des caractรจres gรฉnรฉriques oรน les paramรจtres de notre fonction anonyme ne sont pas nommรฉs. Par exemple

var timesTwo = (_:Int)*2

timesTwo(5)
//10

Dans ce scรฉnario, nous ne nommons pas le paramรจtre que nous transmettons. La seule chose que nous utilisons est un trait de soulignement pour le reprรฉsenter.

ร‰valuation paresseuse

La plupart des langages รฉvaluent sรฉquentiellement les variables et les paramรจtres de fonction, les uns aprรจs les autres. Dans Scala, nous avons un mot-clรฉ appelรฉ lazy, qui aide ร  gรฉrer les valeurs que nous ne voulons pas voir รฉvaluรฉes tant qu'elles ne sont pas rรฉfรฉrencรฉes.

Une variable marquรฉe comme paresseuse ne sera pas รฉvaluรฉe lร  oรน elle est dรฉfinie, c'est ce qu'on appelle communรฉment une รฉvaluation hรขtive, elle ne sera รฉvaluรฉe que lorsqu'elle sera rรฉfรฉrencรฉe plus tard dans le code.

Cela peut รชtre utile lorsque l'รฉvaluation d'une valeur peut รชtre un calcul coรปteux, si la valeur n'est pas toujours nรฉcessaire, nous pouvons nous รฉviter d'exรฉcuter un calcul coรปteux qui peut ralentir notre logiciel en rendant notre 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. Ils aident รฉgalement ร  rรฉsoudre les problรจmes de dรฉpendance circulaire dans le code.

Dans le cas oรน les paramรจtres sont faux, nous n'aurons peut-รชtre pas besoin d'utiliser myExpensiveValue, ce qui peut nous รฉviter d'effectuer un calcul coรปteux, ce qui permet de garantir que les utilisateurs passent un bon moment en utilisant notre application, car leurs autres besoins peuvent รชtre correctement calculรฉs sans surcharger. le bรฉlier.

Dans le cas oรน les paramรจtres sont faux, nous n'aurons peut-รชtre pas besoin d'utiliser myExpensiveValue, ce qui peut nous รฉviter d'effectuer un calcul coรปteux, ce qui permet de garantir que les utilisateurs passent un bon moment en utilisant notre application, car leurs autres besoins peuvent รชtre calculรฉs de maniรจre appropriรฉe sans surcharger. le bรฉlier.

La paresse aide รฉgalement avec les arguments de fonction, oรน les arguments ne sont utilisรฉs que lorsqu'ils sont rรฉfรฉrencรฉs ร  l'intรฉrieur de la fonction. Ce concept est appelรฉ paramรจtres d'appel par nom.

def sometimesUsedString(someValue:String, defaultValue:=> String)={
 if(someValue != null){
   use(defaultValue)
 }else{
   use(someValue)
   }
 }

De nombreux langages utilisent la mรฉthode appel par valeur pour รฉvaluer les arguments. Le paramรจtre passรฉ via l'appel par nom ne sera รฉvaluรฉ qu'en cas de besoin dans le corps de la fonction et ne sera pas รฉvaluรฉ avant cela. Une fois la valeur รฉvaluรฉe, elle est stockรฉe et peut รชtre rรฉutilisรฉe ultรฉrieurement sans qu'il soit nรฉcessaire de la rรฉรฉvaluer. Un concept connu sous le nom de mรฉmorisation.

Infรฉrence de type

Dans Scala, vous n'avez pas besoin de dรฉclarer des types pour chaque variable que vous crรฉez. En effet, le compilateur Scala peut effectuer une infรฉrence de type sur les types en fonction de l'รฉvaluation du cรดtรฉ droit. Cela permet ร  votre code d'รชtre plus concis โ€“ cela nous libรจre de l'รฉcriture passe-partout oรน le type attendu est รฉvident

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compile 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 comme type de retour. ร€ Scala, les fonctions sont considรฉrรฉes comme des citoyens de premiรจre classe. Utiliser ces fonctions de cette maniรจre nous permet d'รชtre trรจs flexibles dans le type de programmes que nous pouvons crรฉer. Nous pouvons crรฉer des fonctions de maniรจre dynamique et intรฉgrer dynamiquement des fonctionnalitรฉs ร  dโ€™autres fonctions.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
    myMathFunction(n)
}

Dans la fonction ci-dessus, nous transmettons un int et une fonction qui prend un int et renvoie un int. Nous pouvons transmettre n'importe quelle fonction de cette signature. Par signature, nous entendons lโ€™entrรฉe et la sortie dโ€™une fonction. Une signature de Int=>Int signifie qu'une fonction prend un Int comme entrรฉe et renvoie un Int comme sortie.

Une signature de ()=>Int signifie qu'une fonction ne prend rien en entrรฉe et renvoie un Int en sortie. Un exemple dโ€™une fonction comme celle-lร  serait celle qui gรฉnรจre un entier alรฉatoire pour nous.

def generateRandomInt()={
 return scala.util.Random.nextInt()
}

La fonction ci-dessus a une signature ()=>Int

Nous pouvons avoir une fonction qui a une signature scala()=>Unit. Cela signifie que les fonctions ne prennent rien et ne renvoient pas de type. La fonction pourrait effectuer une sorte de calcul en modifiant quelque chose pour faire quelque chose de prรฉdรฉterminรฉ.

Ces types de mรฉthodes ne sont cependant pas encouragรฉs, car ils semblent รชtre une boรฎte noire qui peut affecter un systรจme de maniรจre inconnue. Ils sont รฉgalement intestables. Avoir des types d'entrรฉe et de sortie explicites nous permet de raisonner sur ce que fait notre fonction.

Une fonction d'ordre supรฉrieur peut รฉgalement renvoyer une fonction.

Par exemple, nous pourrions crรฉer une mรฉthode qui crรฉera une fonction d'alimentation, c'est-ร -dire 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. Notre type de retour est une fonction anonyme qui prend un Int x, * nous utilisons l'int x comme argument pour la fonction puissance.

Curry

En Scala, nous pouvons convertir une fonction qui prend deux arguments en une fonction qui prend un argument ร  la fois. Lorsque nous transmettons un argument, nous l'appliquons partiellement et nous nous retrouvons avec une fonction qui prend un argument pour complรฉter la fonction. Le currying nous permet de crรฉer des fonctions en ajoutant partiellement quelques arguments.

Cela peut รชtre utile pour crรฉer des fonctions dynamiquement avant d'avoir un ensemble complet d'arguments

def multiply two numbers(n:Int)(m:Int): Unit ={
  return n * m
}

Si nous devons crรฉer une fonction qui multiplie par un nombre spรฉcifique, nous n'avons pas besoin de crรฉer une autre mรฉthode de multiplication.

Nous pouvons simplement appeler le .curried sur notre fonction ci-dessus et obtenir une fonction qui prend d'abord un argument et renvoie une fonction partiellement appliquรฉe.

def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) 

multiplyByFive(4)

//returns 20

Correspondance de motif

Scala dispose d'un puissant mรฉcanisme intรฉgrรฉ pour nous aider ร  vรฉrifier si une variable correspond ร  certains critรจres, un peu comme nous le ferions dans une instruction switch dans Java ou dans une sรฉrie d'instructions if/else. Le langage propose une correspondance de modรจles que nous pouvons utiliser pour vรฉrifier si une variable est d'un type particulier. La correspondance de modรจles dans Scala est puissante et peut รชtre utilisรฉe pour dรฉstructurer les composants qui ont une mรฉthode de dรฉsapplication afin d'obtenir les champs qui nous intรฉressent directement ร  partir de la variable que nous faisons correspondre.

La correspondance de modรจles de Scala fournit รฉgalement une syntaxe plus agrรฉable par rapport ร  l'instruction switch.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

Nous comparons notre variable ร  un ensemble d'options, et lorsque la variable que nous faisons correspondre rรฉpond aux critรจres, l'expression ร  droite de la grosse flรจche (=>) est รฉvaluรฉe et est renvoyรฉe comme rรฉsultat de la correspondance.

Nous utilisons un trait de soulignement pour dรฉtecter les cas qui ne correspondent pas ร  notre code. Il reflรจte le comportement du cas par dรฉfaut lors du traitement des instructions 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 _ => //case we have a type we don't recognize do sth else
}

Dans le code ci-dessus, vous pouvez connaรฎtre le type de la variable myItem et, en fonction de cette branche, passer ร  un code spรฉcifique.

La correspondance de modรจles vรฉrifie si la variable correspond

Le trait de soulignement fonctionne comme un espace rรฉservรฉ qui correspond ร  toute autre condition qui ne correspond pas aux autres รฉlรฉments des instructions case ci-dessus. Nous prenons une variable myItem et appelons la mรฉthode match.

  • nous vรฉrifions si myItem est vrai en utilisant et faisons un peu de logique sur le cรดtรฉ droit de la grosse flรจche ยซ => ยป.
  • nous utilisons le trait de soulignement pour faire correspondre tout ce qui ne correspond ร  aucune des instructions case que nous avons dรฉfinies dans le code.

Avec les classes Case, nous pouvons mรชme aller plus loin et dรฉstructurer la classe pour obtenir des champs ร  l'intรฉrieur de l'objet.

En utilisant le mot-clรฉ scellรฉ pour dรฉfinir nos classes, nous bรฉnรฉficions de l'avantage de permettre au compilateur de vรฉrifier de maniรจre exhaustive les cas avec lesquels nous essayons de comparer et de nous avertir si nous oublions de gรฉrer un cas particulier.

Immutabilitรฉ

Il est possible de crรฉer des valeurs qui ne peuvent pas รชtre modifiรฉes par d'autres fonctions dans Scala ร  l'aide du mot-clรฉ val. Ceci est rรฉalisรฉ dans Java en utilisant le mot-clรฉ final. Dans Scala, nous le faisons en utilisant un val mot-clรฉ lors de la crรฉation d'une variable au lieu d'utiliser var, qui est l'alternative que nous utiliserions pour crรฉer une variable mutable.

Une variable dรฉfinie ร  l'aide du mot-clรฉ val est en lecture seule, alors qu'une variable dรฉfinie avec var peut รชtre lue et modifiรฉe par d'autres fonctions ou arbitrairement par l'utilisateur dans le code.

var changeableVariable = 8

changeableVariable =10
//the compiler doesn't complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//if we try this the code won't compile

Essayer d'attribuer une valeur ร  myNumber aprรจs l'avoir dรฉclarรฉe comme val gรฉnรจre une erreur de compilation ou une ยซ rรฉaffectation ร  val ยป.

Pourquoi utiliser l'Immuabilitรฉ ?

L'immuabilitรฉ nous aide ร  empรชcher le code et d'autres programmeurs de modifier nos valeurs de maniรจre inattendue, ce qui entraรฎnerait des rรฉsultats inattendus s'ils sont destinรฉs ร  utiliser la valeur que nous stockons, ils peuvent ร  la place en faire une copie. De cette faรงon, les bogues pouvant รชtre provoquรฉs par plusieurs acteurs modifiant la mรชme variable sont รฉvitรฉs.

Classes et objets

Nous savons tous que les objets sont les entitรฉs du monde rรฉel et que la classe est un modรจle qui dรฉfinit les objets. Les classes ont ร  la fois un รฉtat et des comportements. Les รฉtats sont soit des valeurs, soit des variables. Les comportements sont les mรฉthodes de Scala.

Voyons comment dรฉfinir une classe, l'instancier et l'utiliser ร  l'aide de Scala.

Ici, la classe appelรฉe Rectangle, qui possรจde deux variables et deux fonctions. Vous pouvez รฉgalement utiliser les paramรจtres l et b directement comme champs dans le programme. Vous avez un objet qui a une mรฉthode principale et qui a instanciรฉ 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 rectangle with length as $length and breadth as  $breadth"
  }
object RectObject {
  def main(args: Array[String]) {
    val rect = new Rectangle(4, 5)
    println(rect.toString)
    println(rect.getArea)    
  }
}

Tous les champs et mรฉthodes sont publics par dรฉfaut dans Scala. Il est essentiel d'utiliser override car la mรฉthode toString est dรฉfinie pour Object dans Scala.

Droit des successions

Scala possรจde plusieurs types d'hรฉritage (comme l'hรฉritage simple, ร  plusieurs niveaux, multiple, hiรฉrarchique, hybride) qui partagent beaucoup de points communs avec les formes traditionnelles trouvรฉes dans Java. Vous pouvez hรฉriter ร  la fois des classes et des traits. Vous pouvez hรฉriter des membres d'une classe dans une autre classe en utilisant le mot-clรฉ ยซ extends ยป. Cela permet la rรฉutilisation.

Il est possible d'hรฉriter d'une ou plusieurs classes. Il est รฉgalement possible d'hรฉriter de sous-classes qui ont elles-mรชmes leurs superclasses, crรฉant ainsi une hiรฉrarchie d'hรฉritage.

Dans l'exemple Scala ci-dessous, la classe Base est Circle et la classe dรฉrivรฉe est Sphere. Un cercle a une valeur appelรฉe rayon, hรฉritรฉe de la classe Sphere. La mรฉthode calcArea est remplacรฉe ร  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 
    }
  }

Abstraction

Dans Scala, nous pouvons crรฉer des mรฉthodes abstraites et des champs membres ร  l'aide de classes et de traits abstraits. ร€ l'intรฉrieur des classes et des traits abstraits, nous pouvons dรฉfinir des champs abstraits sans nรฉcessairement 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 la classe abstraite. Vous pouvez utiliser des traits pour crรฉer des contrats sur ce que notre application devrait รชtre capable de 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)
}

De cette faรงon, nous pouvons planifier ร  quoi ressemblera notre application sans implรฉmenter les mรฉthodes qui peuvent nous aider ร  imaginer ร  quoi ressembleront les diffรฉrentes mรฉthodes. Il suit un modรจle connu sous le nom de programmation d'abstractions et non d'implรฉmentation rรฉelle.

La classe prรฉcรฉdรฉe du mot-clรฉ abstract peut contenir ร  la fois des mรฉthodes abstraites et non abstraites. Mais les hรฉritages multiples ne sont pas pris en charge dans la classe abstraite. Ainsi, vous pouvez รฉtendre au plus une classe abstraite.

Objets Singleton

Un Singleton est une classe qui n'est instanciรฉe qu'une seule fois dans un programme. Il s'agit d'un modรจle de programmation populaire et utile connu sous le nom de ยซ modรจle singleton ยป. Il est utile pour crรฉer des instances censรฉes durer longtemps et qui seront communรฉment accessibles dans tout votre programme dont l'รฉtat fait partie intรฉgrante de la coordination des รฉvรฉnements d'un systรจme. Crรฉer une telle classe dans Scala est simple car Scala nous fournit un moyen simple de crรฉer des singletons ร  l'aide du mot-clรฉ object.

object UserProfile{
    var userName=""
    var isLoggedIn:Boolean = false
}

Nous pouvons alors rรฉfรฉrencer cet objet tout au long de notre programme avec la garantie que toutes les parties de notre programme verront les mรชmes donnรฉes puisqu'il n'y en a qu'une seule instance.

def getLoggedInStatus():Boolean={
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean={
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return  UserProfile.isLoggedIn
}

Le concept de membres statiques n'existe pas dans Scala, c'est la raison pour laquelle vous devez utiliser des objets singleton, qui agissent comme des membres statiques d'une classe.

Classes implicites

Les classes implicites sont la nouvelle fonctionnalitรฉ ajoutรฉe aprรจs la version 2.1. Il s'agit avant tout d'ajouter de nouvelles fonctionnalitรฉs aux classes fermรฉes.

Le mot-clรฉ implicite 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 par * est ajoutรฉe.

object StringUtil {
  implicit class StringEnhancer(str: String) {
    
    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

Vous devez importer 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 (FP)

Dans la POO, les programmes sont construits en regroupant les donnรฉes et les fonctions qui opรจrent sur ces donnรฉes en unitรฉs hautement connectรฉes. Les objets transportent leurs donnรฉes dans les champs et les mรฉthodes qui les utilisent. Dans ce style de programmation, l'abstraction principale concerne les donnรฉes, car les mรฉthodes crรฉรฉes sont censรฉes opรฉrer sur les donnรฉes.

Programmation fonctionnelle, d'autre part, sรฉpare les donnรฉes et les fonctions qui opรจrent sur les donnรฉes. Cela permet aux dรฉveloppeurs de traiter les fonctions comme une abstraction et une force motrice lors de la modรฉlisation des programmes.

Scala permet la programmation fonctionnelle en ayant des fonctions en tant que citoyens de premiรจre classe, ce qui leur permet d'รชtre transmises en tant que valeurs ร  d'autres fonctions et รฉgalement renvoyรฉes en tant que valeurs. La combinaison de ces deux paradigmes a fait de Scala un excellent choix pour crรฉer des logiciels complexes dans divers secteurs, tels que la science des donnรฉes.

Frameworks importants sur Scala

Voici quelques frameworks importants de Scala

  • JOUER est un framework d'application Web open source qui utilise Architecture MVC. Sorti en 2007 et dรฉsormais sous licence Apache, il est devenu le framework le plus populaire sur GitHub en 2013. Des entreprises telles que LinkedIn, Walmart, Samsung, Eero utilisent ce framework.
  • Hauteur de levage est un autre framework Web gratuit รฉcrit en Scala lancรฉ en 2007. Foursquare utilise le framework Lift. Il est trรจs performant et plus rapide ร  crรฉer un framework.
  • Akka
  • Chats
  • Spark

Prise en charge de la concurrence

  • Les valeurs dans Scala sont par dรฉfaut immuables. Cela le rend trรจs adaptatif ร  lโ€™environnement concurrent.
  • Il existe de nombreuses fonctionnalitรฉs dans Scala qui le rendent idรฉal pour les applications simultanรฉes.
  • Futures and Promises facilite le traitement des donnรฉes de maniรจre asynchrone, prenant ainsi en charge le parallรฉlisme.
  • Akka โ€“ boรฎte ร  outils qui utilise le modรจle de concurrence d'acteur. Il existe un certain nombre d'acteurs qui agissent lorsqu'ils reรงoivent des messages.
  • Concurrence utilisant les threads de Java peut รฉgalement รชtre pris en charge dans Scala.
  • Le traitement des flux est une autre fonctionnalitรฉ intรฉressante 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 discussions
  • Fibres de bibliothรจques comme Vertex
  • ZIO โ€“ une bibliothรจque qui contient des primitives pour nous aider ร  gรฉrer la concurrence et le calcul asynchrone
  • STM โ€“ Transaction
  • Future โ€“ intรฉgrรฉ au langage Scala

Java contre Scala

Voici les principaux diffรฉrence entre Java et Scala.

Scala Java
Plus compact et concis Des morceaux de code comparativement plus gros
Conรงu et dรฉveloppรฉ pour รชtre un langage orientรฉ ร  la fois objet et fonctionnel.
Prend en charge une grande variรฉtรฉ de fonctionnalitรฉs de programmation fonctionnelle telles que la concurrence et l'immuabilitรฉ.
Dรฉveloppรฉ ร  lโ€™origine comme un langage orientรฉ objet et a commencรฉ ร  prendre en charge des fonctionnalitรฉs de programmation fonctionnelle ces derniers jours. Ce nโ€™est toujours pas fort en tant que langage de programmation fonctionnel.
Utilise un modรจle d'acteur pour prendre en charge la concurrence qui est moderne Utilise le modรจle conventionnel basรฉ sur les threads pour la concurrence.
Cadres pris en charge โ€“ Play, Lift Prend en charge Spring, Grails et bien plus encore
Prend en charge l'รฉvaluation paresseuse Ne prend pas en charge l'รฉvaluation paresseuse
Aucun membre statique Contient des membres statiques
Prend en charge la surcharge de l'opรฉrateur Ne prend pas en charge la surcharge de l'opรฉrateur
La compilation du code source est relativement lente La compilation du code source est plus rapide que Scala
Traits โ€“ agir comme Java 8 interfaces Java 8 interfaces tentent de combler le fossรฉ entre les classes et les interfaces
Une rรฉรฉcriture est nรฉcessaire La rรฉรฉcriture n'est pas nรฉcessaire
Aucune garantie sur les codes sans bug Assurance complรจte des moindres dรฉfauts
Prend en charge la rรฉtrocompatibilitรฉ. Scala ne prend pas en charge la rรฉtrocompatibilitรฉ.
Operales torseurs sont traitรฉs diffรฉremment dans Java et ne sont pas des appels de mรฉthode. Tous les opรฉrateurs sur les entrรฉes sont effectuรฉs via une mรฉthode appelรฉe en Scala.
Prend en charge plusieurs hรฉritages en utilisant des classes mais pas par des classes abstraites Ne prend pas en charge les hรฉritages multiples ร  l'aide de classes, mais par interfaces
Le code est รฉcrit sous une forme compacte. Le code est รฉcrit sous forme longue.
Scala ne contient pas le mot-clรฉ static. Java contient le mot clรฉ static.

Rรฉsumรฉ

Dans ce didacticiel, vous avez appris ร  dรฉmarrer avec Scala. Vous avez รฉgalement appris les fonctionnalitรฉs fonctionnelles et orientรฉes objet. Vous avez รฉgalement dรฉcouvert les similitudes et les diffรฉrences entre Java et Scala. Ce tutoriel aurait dรป vous aider avec une grande variรฉtรฉ d'exemples bien dรฉmontrรฉs.

Rรฉsumez cet article avec :