Scala Don';t为提高效率,从过滤器返回相同类型
假设我在scala中有一个Scala Don';t为提高效率,从过滤器返回相同类型,scala,scala-collections,Scala,Scala Collections,假设我在scala中有一个映射 Map.filter返回一个Map。 这意味着它必须创建一个包含过滤器后所有剩余项的映射 由于创建一个映射通常并不便宜(大约为O(nlog(n))),如果我只想迭代过滤的结果,这是浪费 例如: val-map=map(1->“你好”,50->“世界”,100->“你好”,1000->“再见”) val filtered=map.filter(x=>x._1“你好”,50->“世界”,100->“你好”,1000->“再见”) val filtered:Iterab
映射
Map.filter
返回一个Map
。
这意味着它必须创建一个包含过滤器后所有剩余项的映射
由于创建一个映射通常并不便宜(大约为O(nlog(n))),如果我只想迭代过滤的结果,这是浪费
例如:
val-map=map(1->“你好”,50->“世界”,100->“你好”,1000->“再见”)
val filtered=map.filter(x=>x._1<100)
对于(x使用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
}
val-map=map(1->“你好”,50->“世界”,100->“你好”,1000->“再见”)
val filtered:Iterable[String]=map.collect{
(x,y)如果x,y
}
仅提供键满足条件的值使用收集
val map = Map(1 -> "hello", 50 -> "world", 100 -> "hi", 1000 -> "bye")
val filtered : Iterable[String] = map.collect{
case(x,y) if x<100 => y
}
val-map=map(1->“你好”,50->“世界”,100->“你好”,1000->“再见”)
val filtered:Iterable[String]=map.collect{
(x,y)如果x,y
}
仅提供键满足条件的值请注意,如果您只想在中进行迭代以获得理解或类似信息(即flatMap
,foreach
,map
),则不会创建中间集合:
for (x <- map if (x._1 < 100)) println(x._2) // Doesn't create an intermediate Map
for(x请注意,如果您只想在中进行迭代,以便于理解或类似(即flatMap
,foreach
,map
),则不会创建中间集合:
for (x <- map if (x._1 < 100)) println(x._2) // Doesn't create an intermediate Map
用于(x)如果你想迭代两次,并且不想从中构建太昂贵的东西,视图
可能是最好的解决方案。如果过滤器
很昂贵,或者你想从中构建昂贵的东西,迭代器
将是最好的。另外,另一个选择可能是编写你自己的方法来构建List(或您喜欢的任何其他结构)从映射和谓词。如果您想迭代两次,并且不想从中构建太昂贵的东西,view
可能是最好的解决方案。如果过滤器
很昂贵或者您要从中构建昂贵的东西,迭代器
将是最好的。另外,其他选项可能是编写own方法,该方法根据映射和谓词构建列表(或您喜欢的任何其他结构)。