我正在寻找collectscala 2.7中的方法,但我似乎找不到适用的调用.有没有相当于collect我可以在scala中使用的东西?
要清楚我想要从列表中过滤元素并将过滤后的元素映射到新类型.
你可以使用flatMap(2.7中的完整方法签名def flatMap[B](f : (A) => Iterable[B]) : List[B]).它宣布双方Iterable和Iterator(略有不同的签名):
scala> val l = List("1", "Hello", "2")
l: List[java.lang.String] = List(1, Hello, 2)
scala> val ints = l.flatMap { s => try { Some(s.toInt) } catch { case _ => None } }
ints: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我采取的显式转换的优势option2iterable在Predef.它在2.8中声明TraversableLike:
def flatMap[B, That](f: A => Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That
Run Code Online (Sandbox Code Playgroud)
使用flatMap/ Option,正如克里斯所描述的那样,我通常会这样做,但有一种更为复杂的选择,有时更令人愉悦:
class Filter[A](f: Any => Option[A]) {
def unapply(a: Any) = f(a)
}
object Filter {
def apply[A](f: Any => Option[A]) = new Filter(f)
}
val evens = Filter {
case n: Int if n % 2 == 0 => Some(n)
case _ => None
}
Run Code Online (Sandbox Code Playgroud)
用法:
scala> for (evens(n) <- List.range(0,10)) yield n
res0: List[Int] = List(0, 2, 4, 6, 8)
Run Code Online (Sandbox Code Playgroud)