很抱歉新手问题,但我无法在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))
我应该使用哪个操作符来达到同样的效果?
答案 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)
毕竟不是那么糟糕。