Je fais un projet à Scala, mais je suis assez nouveau dans la langue et j’ai une formation en Java. Je vois que Scala n’a pas ArrayList, donc je me demande quel est l’équivalent de ArrayList de Java dans Scala, et s’il existe des différences importantes entre les versions Java et Scala.
EDIT: Je ne recherche pas un comportement spécifique autant qu’une représentation interne (données stockées dans un tableau, mais le tableau entier n’est pas visible, seulement la partie que vous utilisez).
Je peux penser à 3 questions plus spécifiques pour répondre à la vôtre:
ArrayList
? Array
dans Scala? Voici donc les réponses à ces questions:
L’équivalent de Scala de l’interface List
de Java est le Seq
. Une interface plus générale existe également, qui est le GenSeq
– la principale différence étant qu’un GenSeq
peut avoir des opérations traitées en série ou en parallèle, selon l’implémentation.
Parce que Scala permet aux programmeurs d’utiliser Seq
tant que fabrique, ils ne prennent pas souvent la peine de définir une implémentation particulière à moins de s’en préoccuper. Quand ils le font, ils choisissent généralement soit la List
de Scala, soit le Vector
. Ils sont tous deux immuables et Vector
a de bonnes performances d’access indexé. D’autre part, List
fait très bien les opérations qu’il fait bien.
ArrayList
? Ce serait scala.collection.mutable.ArrayBuffer
.
Array
dans Scala? Eh bien, la bonne nouvelle est que vous pouvez simplement utiliser Array
in Scala! En Java, Array
est souvent évité en raison de son incompatibilité générale avec les génériques. C’est une collection à co-variantes, alors que les génériques sont invariants, mutables – ce qui fait de sa co-variance un danger, elle accepte les primitives là où les génériques ne le font pas, et son ensemble de méthodes est assez limité.
Dans Scala, Array
– qui est toujours le même que dans Java – est invariant, ce qui fait disparaître la plupart des problèmes. Scala accepte AnyVal
(l’équivalent des primitives) en tant que types pour ses “génériques”, même si cela fera de la boxe automatique. Et grâce au modèle “enrichir ma bibliothèque”, TOUTES les méthodes Seq
sont disponibles pour Array
.
Donc, si vous voulez un Array
plus puissant, utilisez simplement un Array
.
Les méthodes par défaut disponibles pour toutes les collections produisent toutes de nouvelles collections. Par exemple, si je fais ceci:
val ys = xs filter (x => x % 2 == 0)
Alors ys
sera une nouvelle collection, alors que xs
sera toujours la même qu’avant cette commande. Ceci est vrai, peu importe ce que xs
était: Array
, List
, etc.
Naturellement, cela a un coût – après tout, vous produisez une nouvelle collection. Les collections immuables de Scala sont beaucoup plus efficaces pour gérer ce coût car elles sont persistantes , mais cela dépend de l’opération exécutée.
Aucune collection ne peut faire grand chose sur le filter
, mais une List
a d’excellentes performances pour générer une nouvelle collection en ajoutant un élément ou en supprimant la tête – les opérations de base d’une stack, en fait. Vector
a de bonnes performances sur un tas d’opérations, mais cela ne paye que si la collection n’est pas petite. Pour des collections de cent éléments, par exemple, le coût total pourrait dépasser les gains.
Ainsi, vous pouvez réellement append ou supprimer des éléments dans un Array
, et Scala produira un nouveau Array
pour vous, mais vous paierez le coût d’une copie complète lorsque vous le ferez.
Les collections mutables Scala ajoutent quelques autres méthodes. En particulier, les collections qui peuvent augmenter ou diminuer la taille – sans produire une nouvelle collection – mettent en œuvre les caractères Growable
et Shrinkable
. Ils ne garantissent cependant pas de bonnes performances sur ces opérations, mais ils vous indiqueront les collections que vous souhaitez récupérer.
C’est ArrayBuffer
de scala.collection.mutable
. Vous pouvez trouver les scaladocs ici .
Avez-vous ArraySeq
?
Il est difficile de dire exactement ce que vous devez faire, car vous n’avez pas dit quel comportement de ArrayList
vous souhaitez utiliser. Il est plus utile de réfléchir aux traits de scala dont vous souhaitez tirer parti. Voici une bonne explication: http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html .
Cela dit, vous voulez probablement une sorte de IndexedSeq
.