В общем, если вас интересует безопасность потоков, то общепринятым подходом является использование Java AtomicReference
для переноса изменяемой переменной следующим образом:
val fooSeq: AtomicReference[Seq[Foo]] = new AtomicReference(Seq.empty)
и это было бы лучшим подходом, если вам нужны промежуточные результаты вместо того, чтобы идти с Строителем.
Если вам не нужны промежуточные результаты, тогда Строители, как правило, лучше. (Хотя, как упоминает Луис Мигель в комментарии, Builders являются внутренне изменяемыми и не обязательно ориентированными на многопотоковое исполнение)
Третий вариант - использовать изменяемую структуру данных из Scala collections
: https://docs.scala-lang.org/overviews/collections/performance-characteristics.html
Возможно, вас заинтересует: MutableList
, однако для обеспечения безопасности потоков все равно потребуется оболочка AtomicReference
, если это является проблемой. Существуют некоторые структуры данных, которые изначально ориентированы на многопоточность, например TrieMap
, и они доступны в collections.concurrent