假设我在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))
,但这意味着对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
是非严格的。