不要从过滤器返回相同类型的效率

时间:2019-12-17 14:31:04

标签: scala scala-collections

假设我在Scala中有一个Map

Map.filter返回一个Map。 这意味着它必须创建一个包含过滤器之后所有剩余项目的地图。

由于创建地图通常并不便宜(大约为O(nlog(n))),因此如果我要做的只是遍历过滤后的结果,这将很浪费。

例如:

val map = Map(1 -> "hello", 50 -> "world", 100 -> "hi", 1000 -> "bye")
val filtered = map.filter(x => x._1 < 100)
for(x <- filtered) println(x._2)

我不认为使用map.toIterable会有所帮助,因为基础仍然是Map,而filter是虚拟的。

我不知道map.view是否具有必需的行为。

我认为map.iterator可以工作,但这意味着我不能对迭代器进行两次迭代。我想我可以使用map.iterator.filter(x => x._1 < 100).toList吗?

我可以做map.map(x => (x)),但这意味着对地图进行两次迭代。

什么是最简单,最惯用且并非不必要的低效率方式?

2 个答案:

答案 0 :(得分:0)

使用collect

val map = Map(1 -> "hello", 50 -> "world", 100 -> "hi", 1000 -> "bye")
val filtered : Iterable[String] = map.collect{
 case(x,y) if x<100 => y
}

仅给您键满足条件的值

答案 1 :(得分:0)

请注意,如果您只想进行理解或类似的迭代(即flatMapforeachmap),则不会创建中间集合:< / p>

for (x <- map if (x._1 < 100)) println(x._2)  // Doesn't create an intermediate Map

这不合算

map.withFilter(x => x._1 < 100).foreach(x => println(x))

withFilter是非严格的。