Scala Don';t为提高效率,从过滤器返回相同类型

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

假设我在scala中有一个
映射

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方法,该方法根据映射和谓词构建列表(或您喜欢的任何其他结构)。