Подтвердить что ты не робот

Scala: фильтрация коллекции опций

Скажем, у меня есть функция, которая проверяет, применима ли какая-либо операция к экземпляру A, и если да, возвращает экземпляр B или None:

   def checker[A,B]( a: A ) : Option[B] = ...

Теперь я хочу создать новую коллекцию, содержащую все допустимые экземпляры 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]

Спасибо!

4b9b3361

Ответ 1

Это должно сделать это:

val bs = as.flatMap(checker)

Ответ 2

Ответ выше правильный, но если вы можете переписать 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)

collect принимает экземпляр PartialFunction в качестве аргумента и применяет его ко всем элементам коллекции. В нашем случае функция определена только для Ints и "5" фильтруется. Итак, collect представляет собой комбинацию map и filter, что в точности соответствует вашему случаю.