假设我们有一个按照某种顺序排序的值列表。我们还有一个映射到这些值的元素映射。我们希望从列表中获取元素的集合,其顺序与列表中的键相同。一种直截了当的方法是:
val order = Seq("a", "b", "c")
val map = Map("a" -> "aaa", "c" -> "ccc")
val elems = order.map(map.get(_)).filter(_.isDefined).map(_.get)
但是程序需要对集合进行三次迭代。是否可以更有效地实现此功能?特别是,是否可以使用 collect 方法执行此操作?
答案 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