Scala tipo di raccolta per il filtro
-
19-09-2019 - |
Domanda
Si supponga di disporre di un Elenco(1,"1") viene digitato Elenco[Qualsiasi], che è naturalmente corretto e previsto.Ora, se io la mappa la lista come questa
scala> List(1, "1") map {
| case x: Int => x
| case y: String => y.toInt
| }
la risultante è di tipo List[Int], che è previsto così.La mia domanda è se c'è un equivalente per la mappa del filtro, perché l'esempio che segue è il risultato in un Elenco[Qualsiasi].È possibile questo?Presumo che questo potrebbe essere risolto a tempo di compilazione e possibilmente non runtime?
scala> List(1, "1") filter {
| case x: Int => true
| case _ => false
| }
Soluzione
Scala 2.9:
scala> List(1, "1") collect {
| case x: Int => x
| }
res0: List[Int] = List(1)
Altri suggerimenti
Per chiunque di imbattersi in questa domanda vi chiedete perché il più votato risposta non lavoro per loro, essere consapevoli del fatto che il partialMap
il metodo è stato rinominato collect
prima Scala 2.8 del rilascio finale.Invece, provare questo:
scala> List(1, "1") collect {
| case x: Int => x
| }
res0: List[Int] = List(1)
(Questo in realtà dovrebbe essere un commento su Daniel C.Sobral altrimenti-bella risposta, ma come un nuovo utente, non mi è permesso un commento di sicurezza.)
Per quanto riguarda la tua domanda modificata, se è sufficiente utilizzare una guardia nel caso che compongono il vostro partialFunction, si ottiene il filtro:
scala> val l1 = List(1, 2, "three", 4, 5, true, 6)
l1: List[Any] = List(1, 2, three, 4, 5, true, 6)
scala> l1.partialMap { case i: Int if i % 2 == 0 => i }
res0: List[Int] = List(2, 4, 6)