Як відфільтрувати жодного із списку [Варіант]?


105

Якщо у мене є List[Option[A]]Scala, який ідіоматичний спосіб відфільтрувати Noneзначення?

Одним із способів є використання наступного:

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)

Чи є більш "ідіоматичний" спосіб? Це здається досить простим.


Відповіді:


161

Якщо ви хочете одночасно позбутися варіантів, ви можете скористатися flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)

23
Я додам, що flatMapможна використовувати для обробки елементів списку, крім Nones, подібних до того someList.flatten.map, як часто хочеться працювати з цими елементами, а не лише flattenзі списком із задоволення.
Френк

Так, я вагаючись запитав у Рафа, що він очікує зробити із відфільтрованим списком. Але є також дуже багато сценаріїв, коли просто хочеться вирівняти.
Ніколя

Іноді я хочу отримати вміст Optionоб'єктів, але інший раз мені потрібно, щоб вони залишалися як Option[A]. Я знаходжу все більше використання для Option[A]- класної функції.
Ральф

Чи існує еквівалентний метод flatForeach?
cdmckay

1
Якщо ваш збір є незмінним, faltmap зробить свою справу. Якщо ви колекція є змінною, ні, немає.
Ніколя


2

catsБібліотека також flattenOption, яка перетворює будь-якого F[Option[A]]в F[A](де F[_]є FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.