为了效率,不要 return 来自过滤器的相同类型
Don't return same type from filter for efficiency
假设我在 scala 中有一个 Map
。
Map.filter
returns一个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
}
只为您提供键满足条件的值
请注意,如果您想做的只是迭代理解或类似的(即 flatMap
、foreach
、map
),则不会创建中间集合:
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
是非严格的。
假设我在 scala 中有一个 Map
。
Map.filter
returns一个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
}
只为您提供键满足条件的值
请注意,如果您想做的只是迭代理解或类似的(即 flatMap
、foreach
、map
),则不会创建中间集合:
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
是非严格的。