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
     | }
È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top