what switch pattern generic comprehension list scala pattern-matching

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))