我正在寻找一种惯用的方法:
val list = Seq(1, 2, 3, 4, 5, 6, 7)
list.flatMap(i => if (i % 2 == 0) Some(i * 2) else None)
list.flatMap(i => if (i % 2 == 0) (i * 2) :: Nil else Nil)
两种方式都可以返回预期结果,我不确定哪种方式更好。谢谢你的时间!
编辑:
我知道list.filter(_ % 2 == 0).map(_ * 2)
对于这个简单的情况很有用,但我的实际案例很复杂,过滤器有多个可接受的条件,每个条件都有自己的过滤元素句柄函数。
答案 0 :(得分:4)
对于多个过滤条件和相关计算,您可以尝试这样的方法。
val list = Seq(1, 2, 3, 4, 5, 6, 7)
list.collect {
case i if (i % 2 == 0) => i * 2
case i if (i % 3 == 0) => i * 3
case i if (i % 5 == 0) => i * 5
} //> res0: Seq[Int] = List(4, 9, 8, 25, 12)
如果您需要对不匹配的元素执行某些操作,则可以添加默认值case
。如果你这样做,你也可以使用map
而不是collect
,因为作为case语句的函数不再是部分函数。