Насколько я понимаю, способ создания нового ArrayBuffer
с одним элементом - это сказать
val buffer = ArrayBuffer(element)
или что-то вроде этого:
val buffer = ArrayBuffer[Option[String]](None)
Предположим, x
это коллекция с 3 элементами. Я пытаюсь создать карту, которая создает новый 1-элемент ArrayBuffer
для каждого элемента в x
и связывает элемент в x
с новым буфером. (Это намеренно отдельные изменяемые буферы, которые будут изменены потоками.) Я попробовал это:
x.map(elem => (elem, ArrayBuffer[Option[String]](None))).toMap
Однако я обнаружил (используя System.identityHashCode
), что был создан только один ArrayBuffer
, и все 3элементы были сопоставлены с одинаковым значением.
Почему это происходит? Я ожидал, что выражение кортежа будет оцениваться для каждого элемента x
, и это приведет к созданию нового ArrayBuffer
для каждой оценки выражения.
Что будет хорошим обходным решением?
Я использую Scala 2.11.
Обновление
В процессе создания воспроизводимого примера я разобрался с проблемой. Вот пример;Source
- это интерфейс, определенный в нашем приложении.
def test1(x: Seq[Source]): Unit = {
val containers = x.map(elem => (elem, ArrayBuffer[Option[String]](None))).toMap
x.foreach(elem => println(
s"test1: elem=${System.identityHashCode(elem)} container=${System.identityHashCode(containers(elem))}"))
x.indices.foreach(n => containers(x(n)).update(0, Some(n.toString)))
x.foreach(elem => println(s"resulting value: ${containers(elem)(0)}"))
}
Что я пропустил, так это то, что для значений x
, которые я пытался использовать, класс, реализующий Source
, возвращал true для equals()
для всех комбинаций значений. Таким образом, полученная карта имела только одну пару ключ-значение.
Извините, что не выяснил это раньше. Я удалю вопрос через некоторое время.