avantages Scala de Seq.newBuilder sur Seq vars

khan7:

À l' heure actuelle dans ma demande, j'utilise var fooSeq: Seq[Foo] = Seq.emptyet puis en utilisant :+pour ajouter des éléments. Je comprends que cela pourrait conduire à des problèmes et des conditions de course possibles multithreading, mais jusqu'à présent ne l' ai pas eu de problèmes.

J'ai récemment découvert Seq.newBuilder()et semble que cela pourrait être le meilleur moyen d'utiliser des séquences Scala. Je me demande si la prestation de performance est avantageuse par rapport à l' utilisation vars, et tout autre type d'avantages qu'il peut apporter

Fabián Heredia Montiel:

En général, si avec filet de sécurité vous concerne donc une approche commune est d'utiliser Java est AtomicReferencepour envelopper votre variable mutable comme ceci:

val fooSeq: AtomicReference[Seq[Foo]] = new AtomicReference(Seq.empty)

et ce serait la meilleure approche si vous avez besoin des résultats intermédiaires plutôt que d'aller avec le constructeur.

Si vous n'avez pas besoin de résultats intermédiaires puis les constructeurs sont généralement mieux. (Bien que Luis Miguel mentionne dans un commentaire Les constructeurs sont en interne mutable et thread-safe nécessairement)

Une troisième alternative consiste à utiliser une structure de données mutable de Scala collections: https://docs.scala-lang.org/overviews/collections/performance-characteristics.html

Vous pourriez être intéressé par: MutableList, mais cela aurait encore besoin de l' AtomicReferenceemballage pour fil de sécurité si c'est une préoccupation. Il y a des structures de données qui sont en mode natif thread-safe comme TrieMapceux sont disponibles encollections.concurrent

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=399883&siteId=1
conseillé
Classement