Метод сбора на Scala 2.7 - PullRequest
       6

Метод сбора на Scala 2.7

3 голосов
/ 16 декабря 2009

Я ищу collect метод в Scala 2.7, но я не могу найти подходящий вызов. Есть ли что-то эквивалентное collect, которое я могу использовать в scala?

Чтобы было ясно, я собираюсь отфильтровать элементы из списка и отобразить отфильтрованные элементы в новый тип.

Ответы [ 3 ]

7 голосов
/ 16 декабря 2009

Использование 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
}

Использование:

scala> for (evens(n) <- List.range(0,10)) yield n
res0: List[Int] = List(0, 2, 4, 6, 8)
7 голосов
/ 16 декабря 2009

Вы можете использовать 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)

В приведенном выше примере я использую явное преобразование option2iterable в Predef. Это объявлено в 2.8 TraversableLike:

def flatMap[B, That](f: A => Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That
1 голос
/ 16 декабря 2009
scala> List(-1,-2, 1,2,3).filter{i => (i % 2) == 0}.map{i => i / 2} 

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

Вы должны разделить два вызова

С очень полезный блог

...