Scala 使用flatmap过滤和计算集合中的值
我正在寻找一种惯用的方法:Scala 使用flatmap过滤和计算集合中的值,scala,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适合这种简单的情况,但我的实际情
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适合这种简单的情况,但我的实际情况很复杂,filter有多个可接受的条件,每个条件都有自己的筛选元素句柄函数。对于多个筛选条件和相关计算,您可以尝试类似的方法
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)
如果需要对不匹配的元素执行某些操作,可以添加默认情况。如果这样做,您最好使用map而不是collect,因为case语句中的函数不再是分部函数。对于多个过滤条件和相关计算,您可以尝试类似的方法
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)
如果需要对不匹配的元素执行某些操作,可以添加默认情况。如果您这样做,您最好使用map而不是collect,因为case语句的函数不再是分部函数。惯用方法是list.filter%2==0Seq1,2,3,4,5,6,7.filter%2!=0.map_*2?惯用方式是list.filter_%2==0Seq1、2、3、4、5、6、7.filter_%2!=0.0地图*2?