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.


Jawaban:


161

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

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

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]]


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.