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



假设我在scala中有一个Map

Map.filter返回一个Map。 这意味着它必须创建一个包含过滤器后所有剩余项目的 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没有帮助,因为底层仍然是Mapfilter是虚拟的。

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

我认为map.iterator会起作用,但这意味着我不能迭代迭代器两次。我想我可以用map.iterator.filter(x => x._1 < 100).toList

我可以做map.map(x => (x)),但这意味着遍历地图两次。

做我想做的事的最简单、最惯用、不是不必要的低效方法是什么?

请注意,如果您只想进行迭代以进行理解或类似(即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是非严格的。

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

仅提供键满足条件的值

最新更新