方法收集Scala 2.7

时间:2009-12-16 09:38:18

标签: list scala

我在scala 2.7中寻找collect方法,但我似乎找不到适用的电话。我可以在scala中使用等同于collect的东西吗?

要清楚我想要从列表中过滤元素并将过滤后的元素映射到新类型。

3 个答案:

答案 0 :(得分:7)

您可以使用flatMap(2.7中的完整方法签名为def flatMap[B](f : (A) => Iterable[B]) : List[B])。它在IterableIterator上声明(签名略有不同):

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)

在上面的例子中,我正在利用option2iterable中的显式转换Predef。它在TraversableLike上的2.8中声明:

def flatMap[B, That](f: A => Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That

答案 1 :(得分:7)

使用flatMap / Option,正如Chris所描述的那样,我通常采用这种方式,但有一种更为复杂的选择,有时更令人赏心悦目:

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
}

用法:

scala> for (evens(n) <- List.range(0,10)) yield n
res0: List[Int] = List(0, 2, 4, 6, 8)

答案 2 :(得分:1)

scala> List(-1,-2, 1,2,3).filter{i => (i % 2) == 0}.map{i => i / 2} 

line10: scala.List[scala.Int] = List(-1,1) 

你需要从a very useful blog

中分出两个电话