Добавление элемента в Seq в scala
Я работаю с scala play 2 с slick.
У меня есть Seq, как
val customerList: Seq[CustomerDetail] = Seq(CustomerDetail("id", "status", "name"))
Я хочу добавить элемент CustomerDetail в этот список клиентов. Как я могу это сделать?
Я уже пробовал
customerList :+ CustomerDetail("1", "Active", "Shougat")
Но это не делать ничего.
2 ответов:
Две вещи. Когда вы используете
:+, операция является левой ассоциативной, то есть элемент, на котором вы вызываете метод, должен быть слева.Теперь,
Seq(как используется в вашем примере) относится кimmutable.Seq. При добавлении или предварении элемента он возвращает новую последовательность , содержащую дополнительный элемент, но не добавляет его к существующей последовательности.val newSeq = CustomerDetail("1", "Active", "Shougat") :+ customerListНо добавление элемента означает обход всего списка, чтобы добавить элемент, рассмотрим предписание:
val newSeq = customerList +: CustomerDetail("1", "Active", "Shougat")Упрощенный пример:
scala> val original = Seq(1,2,3,4) original: Seq[Int] = List(1, 2, 3, 4) scala> val newSeq = 0 +: original newSeq: Seq[Int] = List(0, 1, 2, 3, 4)
Возможно, стоит отметить, что в то время как
Seqоператор добавления элемента,:+, являетсялевым ассоциативным , оператор добавления,+:, являетсяправым ассоциативным .Итак, если у вас есть коллекция
Seqс элементамиList:scala> val SeqOfLists: Seq[List[String]] = Seq(List("foo", "bar")) SeqOfLists: Seq[List[String]] = List(List(foo, bar))И вы хотите добавить еще один "elem" в Seq, добавление выполняется следующим образом:
scala> SeqOfLists :+ List("foo2", "bar2") res0: Seq[List[String]] = List(List(foo, bar), List(foo2, bar2))А предписание делается так:
scala> List("foo2", "bar2") +: SeqOfLists res1: Seq[List[String]] = List(List(foo2, bar2), List(foo, bar))Как описано в API doc :
Мнемоника для +: против :+ это: ободочная кишка переходит на сторону коллекции.
Пренебрежение этим при работе с коллекциями коллекций может привести к неожиданным результатам, т. е.:
scala> SeqOfLists +: List("foo2", "bar2") res2: List[Object] = List(List(List(foo, bar)), foo2, bar2)
Comments