使用flatmap过滤和计算集合中的值

时间:2014-09-03 07:31:41

标签: scala

我正在寻找一种惯用的方法:

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)对于这个简单的情况很有用,但我的实际案例很复杂,过滤器有多个可接受的条件,每个条件都有自己的过滤元素句柄函数。

1 个答案:

答案 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语句的函数不再是部分函数。