如何在迭代过程中排除age为None的Person记录(无需后续过滤)
解决方案
在Scala里,要直接迭代时排除age为None的Person记录,不用先处理再过滤,有两种简洁的方式:
方式一:使用collect
collect可以同时完成过滤和映射操作,只匹配我们需要的模式:
class Person(id: String, age: Option[Double]) val rows: Seq[Person] = List(Person("a", None), Person("c", None), Person("e", Some(50))) val ages = rows.collect { case Person(_, Some(s)) => "prefix" + s.toString } // ages结果:Seq("prefix50.0")
这里只匹配age为Some(s)的Person,自动跳过None的情况,直接生成目标结果集合。
方式二:使用flatMap结合Option.map
利用Option的特性:Some调用map会返回包含转换后值的Some,None调用map还是None;而flatMap会把Option展开成序列(Some对应单元素序列,None对应空序列),自动过滤掉空值:
val ages = rows.flatMap { person => person.age.map(s => "prefix" + s.toString) } // 结果和上面一致:Seq("prefix50.0")
注意
你原来用的foreach是用来执行副作用操作(比如打印日志、修改外部变量)的,它不会返回处理后的集合。如果只是想得到过滤并转换后的结果,上面两种方法更合适,也更符合Scala的函数式编程风格。
内容的提问来源于stack exchange,提问作者IUnknown
相关产品推荐
相关产品推荐

