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.