Au niveau des collections
L’équipe de Scala a procédé à une refonte des collections de la bibliothèque standard afin d’apporter plus de simplicité, performance et sécurité au langage. Pour ce qui concerne les changements, nous avons entre autres les points suivants :
Les signatures de méthodes rendues plus simples
- Les méthodes de transformation ne prennent plus le paramètre implicite CanBuildFrom ;;
- la bibliothèque résultante est plus facile à comprendre (en code, Scaladoc et complétion de code de l’EDI) ;;
- avec la simplification du code, la compilation du code utilisateur est beaucoup plus rapide ;;
- un nouvel objet implicite BuildFrom peut être utilisé dans quelques circonstances.
La hiérarchie des types rendue également plus simples
- Les traits Traversable et TraversableOnce ont été supprimés. Ils restent uniquement sous forme d’alias déconseillés pour Iterable et IterableOnce ;;
- les collections parallèles sont maintenant un module séparé. En conséquence, GenSeq, GenTraversableOnce, et al ont été supprimés.
Le passage par défaut de Scala.Seq comme élément immuable
- Annoncé depuis un bout de temps, Seq est maintenant un alias pour collection.immutable.Seq ;;
- cela change également le type de varargs dans les méthodes et les correspondances de modèles ;;
- les tableaux passés en tant que méthode Java varargs sont copiés de manière défensive, ce qui sous-entend que la méthode varargs n’est pas affectée et les tableaux ne sont pas modifiés.
De nouvelles collections concrètes ajoutées
- La classe abstraite scellée Stream qui implémentait des listes paresseuses où les éléments ne sont évalués que lorsqu’ils sont nécessaires est maintenant obsolète.
- immutable.LazyList remplace immutable.Stream;
- immutable.ArraySeq qui est un wrapper immuable pour les tableaux est maintenant disponible en version mutable ;;
- La classe CollisionProofHashMap empêche les attaques par déni de service ;
- mutable.ArrayDeque a été également ajoutée à Scala 2.13. C’est une file d’attente à deux extrémités qui utilise en interne un tampon circulaire redimensionnable.
En plus des modifications ci-dessus, plusieurs autres changements dans les collections ont été effectués dans cette nouvelle version.
Au niveau de la concurrence
Les futures ont été repensés en interne, avec les objectifs suivants :
- fournir le comportement attendu dans un ensemble plus large de conditions de défaillance ;;
- fournir une base pour une performance accrue ;;
- supporter des applications plus robustes ;;
Nous précisons que Future est un objet qui représente une valeur qui peut ou non être actuellement disponible, mais le sera à un moment donné ou une exception, si cette valeur n’a pas pu être rendue disponible.
Au niveau de la bibliothèque standard
De nouveaux éléments ont atterri dans la bibliothèque standard.
Intégration de l’interopérabilité avec Java
- L’ancien module scala-java8-compat fait maintenant partie de la bibliothèque standard ;;
- ceci fournit des convertisseurs pour les options, les types de fonctions et les flux Java ;;
- Comme mentionné ci-dessus, les convertisseurs de collection tels que JavaConverters ont été déplacés pour s’inscrire dans le nouveau schéma.
Ajout de l’utilitaire scala.util.Using
- Il utilise le modèle de prêt pour fournir une forme simple de gestion automatique des ressources.
Ajout des méthodes .toIntOption et al
- Ces nouvelles méthodes d’extension sur Strings sont fournies par StringOps ;;
- Elles analysent les littéraux et rejettent efficacement les entrées non valides sans générer d’exceptions.
Ajout de convertisseurs entre fonctions et extracteurs
- Les nouvelles méthodes fournissent des conversions entre les objets facultatifs Functions, PartialFunctions et les extracteurs.
Ajout de méthodes .withRight, .withLeft
- Ces méthodes à gauche et à droite autorisent la conversion de l’autre paramètre de type.
Autres modifications dans la Bibliothèque standard : dépréciations et suppressions
Plusieurs dépréciations et suppressions ont été appliquées dans cette dernière version de Scala. Entre autres, nous avons les points ci-dessous :
- La construction de chaînes utilisant + avec un type non-String à gauche (alias any2stringadd) est maintenant obsolète ;;
- PartialFunction.fromFunction remplace PartialFunction.apply ;;
- les projections à droite avec Either sont obsolètes ;;
- la balise @usecase scaladoc est également obsolète ;;
- Equiv est également devenu obsolète ;;
- en outre, les modules suivants ne sont plus inclus dans la distribution : scala-xml, scala-parser-combinators, scala-swing;
- les méthodes et les classes assorties et obsolètes de la bibliothèque standard ont été entièrement supprimées.
Au niveau du langage
Bien que cette dernière version de Scala soit axée sur les améliorations de la bibliothèque standard, des changements ont également été apportés à plusieurs niveaux du côté du langage.
Les types littéraux
- Les littéraux (pour les chaînes, les entiers, etc.) ont maintenant des types littéraux associés ;;
- le compilateur fournira des instances d’une nouvelle classe scala.ValueOf[T] de types pour tous les types de singleton T ;;
- la valeur d’un type singleton est accessible via une méthode appelante valueOf[T].
Activation de l’unification partielle par défaut
- Cette modification améliore l’inférence du constructeur de type ;;
- le support de l’unification partielle de constructeurs de types n’est plus considéré comme expérimental ;;
- le compilateur n’accepte plus -Ypartial-unification.
Prise en charge de paramètres implicites par la méthode By-name avec des dictionnaires récursifs
- cette fonctionnalité étend les arguments de méthode by-name pour prendre en charge les paramètres implicites ;;
- cela permet à la recherche implicite de construire des valeurs récursives ;;
- le cas d’utilisation phare est la dérivation de classe.
Les soulignements dans les littéraux numériques
- Les traits de soulignement peuvent maintenant être utilisés comme entretoises.
Au niveau du compilateur
- Le compilateur Scala est maintenant 5 à 10 % plus rapide que les versions précédentes ;;
- En outre, il génère une sortie identique pour une entrée identique dans plus de cas, pour des versions reproductibles ;;
- Enfin, les opérations sur les collections et les tableaux sont désormais davantage optimisées.
Au-delà de ces améliorations, plusieurs autres optimisations ont été apportées dans cette nouvelle version de Scala.
Source : Scala
Et vous ?
Que pensez-vous de cette nouvelle version de Scala ;? Répond-elle à vos attentes ;?
Quels sont les ajouts, améliorations que vous aimez le plus ;ou le moins ;?
Voir aussi
Feuille de route pour Scala 2.13 : Collections, modularisation et améliorations de performance pour le compilateur
Feuille de route de Scala 3.0 : il utilisera le compilateur Dotty afin de simplifier la structure du langage, Scala 3.0 est attendu en 2020
Scala 3 prévu pour début 2020, peu après la sortie de la version 2.14 : Son créateur nous livre un aperçu de ses nouveautés
Le langage Scala se met à la compilation rapide avec le compilateur incrémental Zinc
Scala Native : un générateur de code natif pour accéder au bas niveau depuis le langage Scala
Quel avenir pour le langage Scala depuis l’arrivée de Java 8, Venez partager votre expérience