Если у меня есть List[Option[A]]
в Scala, каков идиоматический способ отфильтровать None
значения?
Один из способов - использовать следующее:
val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)
Есть ли более «идиоматический» способ? Это действительно кажется довольно простым.
Ответы:
Если вы хотите одновременно избавиться от опций, вы можете использовать
flatten
:источник
flatMap
может быть использовано для обработки элементов списка, отличных отNone
s, аналогично томуsomeList.flatten.map
, как часто хочется работать с этими элементами, а не толькоflatten
со списком из забавы.Option
объектов, но в других случаях мне нужно, чтобы они остались такими жеOption[A]
. Я нахожу все больше и больше применений этойOption[A]
классной функции.someList.filter(_.isDefined)
если вы хотите сохранить тип результата какList[Option[A]]
источник
В
cats
библиотеке также естьflattenOption
, который превращает любойF[Option[A]]
вF[A]
(гдеF[_]
естьFunctorFilter
)источник