将列表添加到Scala中的另一个列表的惯用方法

时间:2015-02-14 19:46:48

标签: scala

很抱歉新手问题,但我无法在Scala中找到这个简写。

val s1 = List(8, 9, 10)
val s2 = List(7, 6, 5)
val s12 = s2.foldLeft(s1)((acc, x) => x :: acc)
assert(s12 === List(5, 6, 7, 8, 9, 10))

我应该使用哪个操作符来达到同样的效果?

2 个答案:

答案 0 :(得分:6)

您可以反转第二个列表并将结果添加到第一个列表

val s12 = s2.reverse ::: s1

有关可用方法的其他文档,请参阅scala.collection.immutable.List APIdocs

e.g。 :::

  

在此列表前添加给定列表的元素。

顺便使用:::这样的方式(中缀符号 - 没有点)是right-associative(这意味着将在正确的对象上调用该方法 - 在这种情况下为s1)。
此外,当使用点表示法调用:::时,它将在点的左侧对象上调用,因此在这种情况下s2.reverse.:::(s1)将导致List(8, 9, 10, 5, 6, 7)

答案 1 :(得分:2)

或者,它可以这样写:

s2 reverse_::: s1

哪个比s2.reverse ::: s1更有效(这也在API文档中指出)。

它也可以用这种可怕的方式写成:

(s1 /: s2)(_.::(_))

第二个想法,也许s2.foldLeft(s1)((acc, x) => x :: acc)毕竟不是那么糟糕。