为了效率,不要 return 来自过滤器的相同类型

Don't return same type from filter for efficiency

假设我在 scala 中有一个 Map

Map.filterreturns一个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)),但这意味着要遍历 Map 两次。

做我想做的事情的最简单、最惯用、效率最低的方法是什么?

使用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
}

只为您提供键满足条件的值

请注意,如果您想做的只是迭代理解或类似的(即 flatMapforeachmap),则不会创建中间集合:

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是非严格的。