如何在scala中组合过滤器和地图?

edd*_*ark 26 dictionary scala filter

List[Int]Scala.名单是List(1,2,3,4,5,6,7,8,9,10).我想要filter列表,以便它只有偶数.而且我想用2代表数字.这有可能吗?

我希望我已经清楚地解释了这个问题.如果您有任何疑问,请询问.提前致谢.

cmb*_*ter 48

正如我在评论中所述,collect应该做你想做的事:

list.collect{
  case x if x % 2 == 0 => x*2
}
Run Code Online (Sandbox Code Playgroud)

collect方法允许您在匹配元素(filter)上指定条件并修改匹配(map)的值

正如@TravisBrown建议的那样,你也可以使用flatMap它,特别是在条件更复杂且不适合作为保护条件的情况下.对于你的例子,这样的事情:

list.flatMap{
  case x if x % 2 == 0 => Some(x*2)
  case x => None
}
Run Code Online (Sandbox Code Playgroud)

  • 以这样一种方式来表达你的状态并不总是可能或方便的,因为它可以作为一个守卫,所以(IMO)一个好的答案应该包括`flatMap`和`Option`(这也是Scala中常见的成语)认识是有用的). (5认同)
  • 还有`withFilter`,与`filter().map()`相比,避免了一次迭代并创建了一个过滤列表作为中间步骤:`list.withFilter(_%2 == 0).map( _*2)` (5认同)

elm*_*elm 7

一种用于理解(其内部展开成的组合mapwithFilter)如下,

for (x <- xs if x % 2 == 0) yield x*2
Run Code Online (Sandbox Code Playgroud)

亦即

xs.withFilter(x => x % 2 == 0).map(x => x*2)
Run Code Online (Sandbox Code Playgroud)