2011-06-17 8 views
24

もっと複雑なオブジェクトタイプを作成したい単純なタイプのリストからリストを作成したい。例えば、List[String] => List[MyType]スカラリストを別のタイプのリストに変換する

マップベースのアプローチを使用して3回行ってきました。ワイルドカードを有する単純なマップ:ケースクラスのコンストラクタを使用

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

パターンマッチングはすでに一致しています。マッチングの行為を使ってデータを変換することはできません!あなたは、「文字列のリストを与えられれば、すでにテレコムのリストになっていますか?」と尋ねています。 –

答えて

33

最初の試みかなりOKです。ラムダ関数の引数のまわりで括弧を使うのを忘れてしまっただけです。代わりに:

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

ニース、そしてドゥー!私の終わりに。私の防衛では、エラーメッセージを書いたのであれば、「ラムダ関数の引数の周りに括弧がない」ということになり、訂正が明らかになります。ありがとう! – Noel

+0

リストにキャストする最初の2つの例で[テレコム]は必要ありません – Tim

+0

@Tim:キャストではありません。確かに必要ではない、ここでの目標は結果の型が正しいことを「証明する」ことである。私はそれらを削除した場合、答えがより明確になると思いますか? – paradigmatic

1

それとも、その加えることができますワンの関心で

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

を私がそれをさらに

に減らすことができると言わなければならない
List("foo","bar").map(telecom(_,0,0)) 
関連する問題