Bagaimana cara menyaring Tidak Ada dari Daftar [Opsi]?

105

Jika saya memiliki List[Option[A]]di Scala, apa cara idiomatik untuk menyaring Nonenilai?

Salah satu caranya adalah dengan menggunakan yang berikut ini:

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

Apakah ada cara yang lebih "idiomatis"? Ini sepertinya sangat sederhana.

Muntah
sumber

Jawaban:

161

Jika Anda ingin menghilangkan opsi pada saat yang sama, Anda dapat menggunakan flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
Nicolas
sumber
23
Saya akan menambahkan bahwa flatMapdapat digunakan untuk memproses elemen daftar selain Nones, mirip dengan someList.flatten.map, karena orang sering ingin bekerja dengan elemen ini dan bukan hanya flattendaftar yang tidak menyenangkan.
Frank
Ya, saya ragu-ragu untuk bertanya kepada Raph apa yang dia harapkan dengan daftar yang difilter. Tetapi ada juga banyak skenario di mana Anda hanya ingin meratakan.
Nicolas
Terkadang saya ingin mengambil kembali konten Optionobjek, tetapi di lain waktu saya membutuhkannya untuk tetap sebagai Option[A]. Saya menemukan semakin banyak kegunaan untuk Option[A]- fitur keren.
Ralph
Apakah ada metode tipe flatForeach yang setara?
cdmckay
1
Jika collection Anda tidak dapat diubah, faltmap akan melakukan triknya. Jika koleksi Anda bisa berubah, tidak, tidak ada.
Nicolas
18

someList.filter(_.isDefined) jika Anda ingin mempertahankan tipe hasil sebagai List[Option[A]]

Kevin O'Riordan
sumber
2

The catsperpustakaan juga memiliki flattenOption, yang ternyata salah F[Option[A]]menjadi F[A](di mana F[_]adalah FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
dcastro
sumber