Gre*_*idt 17 scala map filter option
假设我有一个函数检查某个操作是否适用于A的实例,如果是,则返回B或None的实例:
def checker[A,B]( a: A ) : Option[B] = ...
Run Code Online (Sandbox Code Playgroud)
现在我想形成一个包含B的所有有效实例的新集合,删除None值.以下代码似乎可以完成这项工作,但肯定有更好的方法:
val as = List[A]( a1, a2, a3, ... )
val bs =
as
.map( (a) => checker(a) ) // List[A] => List[Option[B]]
.filter( _.isDefined ) // List[Option[B]] => List[Option[B]]
.map( _.get ) // List[Option[B]] => List[B]
Run Code Online (Sandbox Code Playgroud)
谢谢!
E. *_*rda 11
上面的答案是正确的,但如果你可以重写checker,我建议你使用PartialFunction和collect.PartialFunction是A => B类型的函数,不需要为A的所有值定义.这是一个简单的例子:
scala> List(1, 2, 3, 4, "5") collect {case x : Int => x + 42}
res1: List[Int] = List(43, 44, 45, 46)
Run Code Online (Sandbox Code Playgroud)
collect将PartialFunction的实例作为参数,并将其应用于集合的所有元素.在我们的例子功能仅被定义为Ints和"5"过滤.所以,collect是的组合map和filter,这正是你的情况.