switch - Convertir la lista de Scala a la lista con otro tipo
switch case in scala (3)
Quiero crear una lista de tipo de objeto más complejo a partir de una lista de tipo simple. Por ejemplo, List[String] => List[MyType]
.
Le he dado tres veces usando enfoques basados en mapas. Un mapa simple con comodín:
> case class telecom (name:String, longitude:Double, latitude:Double)
defined class telecom
> List("foo","bar").map(x:String => telecom(x,0,0)):List[telecom]
:1: error: '';'' expected but '')'' found.
Un método de coincidencia de patrones que utiliza el constructor de clase de caso:
> def foo(c:List[String]){
| c match {
| case tc:List[telecom] => tc.map(telecom(_,0,0)):List[telecom]; println("matched telephonecomapny");
| case _ => println("matched nothing"); throw new ClassCastException(); }}
warning: there were unchecked warnings; re-run with -unchecked for details
foo: (c: List[String])Unit
> foo(List("foo","bar"))
java.lang.ClassCastException: java.lang.String cannot be cast to usda.rd.broadband.model.DatabaseTables$TelephoneCompany
at $anonfun$foo$1.apply(<console>:11)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:206)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:206)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61)
at scala.collection.immutable.List.foreach(List.scala:45)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:206)
at scala.collection.immutable.List.map(List.scala:45)
at .foo(<console>:11)
at .<init>(<console>:11)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:9)
at RequestResult$.<clinit>(<console>)
at RequestResult$scala_repl_result(<console...
y un método de comparación de patrones más simple:
> def bar(c:List[String]){
| c match {
| case tc:List[telecom] => tc
| case _ => println("matched nothing")}}
warning: there were unchecked warnings; re-run with -unchecked for details
foo: (c: List[String])Unit
> val r = bar(List("foo","bar"))
t: Unit = ()
El primer intento está bastante bien. Acaba de olvidar usar paréntesis alrededor de los argumentos de la función lambda. En lugar de:
List("foo","bar").map(x:String => telecom(x,0,0)):List[telecom]
Deberías usar:
List("foo","bar").map( (x:String) => telecom(x,0,0)):List[telecom]
o más simple:
List("foo","bar").map( x => telecom(x,0,0))
En el interés de la unidireccional, debo decir que puede reducirse aún más a
List("foo","bar").map(telecom(_,0,0))
O puedes hacer eso:
List("foo","bar").map(x => telecom(x,0,0))