Équivalent Scala de java.util.ArrayList

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:

  • Quelle est la collection par défaut de Scala?
  • Quelle collection Scala a des caractéristiques similaires à ArrayList ?
  • Qu’est-ce qu’un bon remplacement pour Array dans Scala?

Voici donc les réponses à ces questions:

Quelle est la collection par défaut de Scala?

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.

Quelle collection Scala a des caractéristiques similaires à ArrayList ?

Ce serait scala.collection.mutable.ArrayBuffer .

Qu’est-ce qu’un bon remplacement pour 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 .

Qu’en est-il d’une collection qui rétrécit et grandit?

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 .