Hiçbiri Liste Dışı Nasıl Filtrelenir [Seçenek]?


105

Bir List[Option[A]]Scala'ya sahipsem, Nonedeğerleri filtrelemenin deyimsel yolu nedir?

Bunun bir yolu, aşağıdakileri kullanmaktır:

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

Daha "deyimsel" bir yol var mı? Bu oldukça basit görünüyor.


Yanıtlar:


161

Seçeneklerden aynı anda kurtulmak istiyorsanız, şunları kullanabilirsiniz flatten:

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

23
Bunu eklersiniz flatMapdışındaki liste elemanlarını işlemek için kullanılabilir Nonebenzer s, someList.flatten.mapbiri genellikle sadece bu elemanların çalışmak istediği değil gibi flatteneğlenceli dışarı listesi.
Frank

Evet, Raph'a filtrelenmiş listeyle ne yapmayı umduğunu sormakta tereddüt ettim. Ama düzleştirmek istediğiniz birçok senaryo da var.
Nicolas

Bazen Optionnesnelerin içeriğini geri almak isterim , ancak diğer zamanlarda da öyle kalmaları gerekir Option[A]. Option[A]- Harika özellik için gittikçe daha fazla kullanım buluyorum .
Ralph

Eşdeğer bir flatForeach tipi yöntem var mı?
cdmckay

1
Koleksiyonunuz değişmez ise, faltmap işinizi görecektir. Koleksiyonunuz değiştirilebilirse, hayır, yoktur.
Nicolas

18

someList.filter(_.isDefined) sonuç türünü şu şekilde tutmak istiyorsanız List[Option[A]]


2

catsAyrıca var kütüphane flattenOptiondöner bir F[Option[A]]bir halinde F[A](burada F[_]a, FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.