Конвертировать Scala List в List с другим типом - PullRequest
27 голосов
/ 17 июня 2011

Я хочу создать более сложный объект типа List из простого типа List.Например, List[String] => List[MyType].

Я дал три, используя подходы на основе карт.Простая карта с подстановочным знаком:

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

Метод сопоставления с образцом, использующий конструктор класса дела:

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

и более простой метод сопоставления с образцом:

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

Ответы [ 3 ]

37 голосов
/ 17 июня 2011

Первая попытка вполне нормальная. Вы просто забыли использовать круглые скобки вокруг аргументов лямбда-функции. Вместо:

List("foo","bar").map(x:String => telecom(x,0,0)):List[telecom]

вы должны использовать:

List("foo","bar").map( (x:String) => telecom(x,0,0)):List[telecom]

или проще:

List("foo","bar").map( x => telecom(x,0,0))
26 голосов
/ 17 июня 2011

В интересах единоличного мастерства, я должен сказать, что оно может быть уменьшено до

List("foo","bar").map(telecom(_,0,0))
2 голосов
/ 17 июня 2011

Или вы можете сделать это:

List("foo","bar").map(x => telecom(x,0,0))
...