【问题标题】:Add an item in a Seq in scala在 scala 的 Seq 中添加一个项目
【发布时间】:2016-09-06 06:11:19
【问题描述】:

我正在使用 scala play 2 和 slick。 我有一个类似的序列

val customerList: Seq[CustomerDetail] = Seq(CustomerDetail("id", "status", "name"))

我想在这个 customerList 中添加一个 CustomerDetail 项。我怎样才能做到这一点? 我已经试过了

customerList :+ CustomerDetail("1", "Active", "Shougat")

但这没有任何作用。

【问题讨论】:

    标签: scala seq


    【解决方案1】:

    两件事。当您使用:+ 时,操作是左关联的,这意味着您调用该方法的元素应该在左侧。

    现在,Seq(在您的示例中使用)指的是immutable.Seq。当您追加或前置一个元素时,它会返回一个包含额外元素的新序列,它不会将其添加到现有序列中。

    val newSeq = customerList :+ CustomerDetail("1", "Active", "Shougat")
    

    但是追加一个元素意味着遍历整个列表以添加一个项目,考虑前置:

    val newSeq = CustomerDetail("1", "Active", "Shougat") +: customerList
    

    一个简化的例子:

    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 本身的抽象只暴露了不可变的属性。
    • 哪一个? scala.collection.mutable.Seq 绝对公开了可变属性。
    • 我和 OP 在这个例子中使用的不可变的。
    【解决方案2】:

    可能值得指出的是,虽然Seq 追加项目运算符:+左关联,但前置运算符+:右关联 em>。

    所以如果你有一个带有List 元素的Seq 集合:

    scala> val SeqOfLists: Seq[List[String]] = Seq(List("foo", "bar"))
    SeqOfLists: Seq[List[String]] = List(List(foo, bar))
    

    并且你想在 Seq 中添加另一个“elem”,追加是这样完成的:

    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中所述:

    +: 与 :+ 的助记符是:COLon 在 COLlection 一侧。

    在处理集合的集合时忽略这一点可能会导致意想不到的结果,即:

    scala> SeqOfLists +: List("foo2", "bar2")
    res2: List[Object] = List(List(List(foo, bar)), foo2, bar2)
    

    【讨论】:

    • @Yuval 我还不能对你的帖子发表评论,所以我在这里添加评论。在撰写本文时,您的附加和前置示例在:(冒号)的错误一侧有customerList。添加到的集合应位于运算符的冒号一侧。
    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 2012-01-07
    • 1970-01-01
    • 2020-05-30
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多