Ответ 1
Это должно сделать это:
val bs = as.flatMap(checker)
Скажем, у меня есть функция, которая проверяет, применима ли какая-либо операция к экземпляру 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]
Спасибо!
Это должно сделать это:
val bs = as.flatMap(checker)
Ответ выше правильный, но если вы можете переписать 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
, что в точности соответствует вашему случаю.