如何根据某种方法的结果收集集合的元素?

时间:2011-06-02 13:44:23

标签: scala scala-collections

假设我们有一个按照某种顺序排序的值列表。我们还有一个映射到这些值的元素映射。我们希望从列表中获取元素的集合,其顺序与列表中的键相同。一种直截了当的方法是:

val order = Seq("a", "b", "c")
val map = Map("a" -> "aaa", "c" -> "ccc")

val elems = order.map(map.get(_)).filter(_.isDefined).map(_.get)

但是程序需要对集合进行三次迭代。是否可以更有效地实现此功能?特别是,是否可以使用 collect 方法执行此操作?

4 个答案:

答案 0 :(得分:3)

嗯,标准的Scala地图也是PartialFunction,所以你可以使用“collect”。

val elems = order.collect(map)

答案 1 :(得分:2)

如果您将其基于Option返回,则可行:

order flatMap (map get)

当然,在这个特定的例子中order collect map就足够了。

答案 2 :(得分:1)

您可以使用flatMap。这是一个例子:

List(1,2,3,4,5).flatMap(x => if (x%2 == 1) Some(2*x) else None)

这相当于

List(1,2,3,4,5).filter(_%2==1).map(2*)

答案 3 :(得分:1)

更一般地说,您可以使用视图;然后集合只迭代一次,并且随时应用所有三个操作:

order.view.map(map.get).filter(_.isDefined).map(_.get).force