2011-06-17 49 views
24

Tôi muốn tạo một loại đối tượng phức tạp hơn Danh sách từ một Danh sách loại đơn giản. Ví dụ: List[String] => List[MyType].Chuyển đổi Danh sách Scala thành Danh sách với một loại khác

Tôi đã cung cấp cho nó ba cách sử dụng các phương pháp dựa trên bản đồ. Một bản đồ đơn giản với wildcard:

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

Một phương pháp mô hình khớp có sử dụng các nhà xây dựng trường lớp:

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

và một phương pháp mô hình khớp đơn giản:

> 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

Đối sánh mẫu khớp _ đã có ở đó_. Bạn không thể sử dụng hành động phù hợp để chuyển đổi dữ liệu của bạn! Bạn đang yêu cầu, "Đưa ra một danh sách các chuỗi, _if họ đã là một danh sách các telecoms_, sau đó (blah blah)!" –

Trả lời

33

Các thử đầu tiên khá ổn. Bạn chỉ cần quên sử dụng dấu ngoặc đơn xung quanh các đối số hàm lambda. Thay vì:

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

bạn nên sử dụng:

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

hoặc đơn giản hơn:

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

Đẹp, và doh! về phía tôi. Trong phòng thủ của tôi, nếu bạn đã viết thông báo lỗi, nó sẽ là "thiếu parens xung quanh đối số chức năng lambda" và sửa chữa sẽ là hiển nhiên. Cảm ơn! – Noel

+0

truyền vào Danh sách [viễn thông] trong 2 ví dụ đầu tiên là không cần thiết – Tim

+0

@Tim: Nó không phải là một diễn viên, nó là một loại ascription. Nó thực sự là không cần thiết, mục tiêu ở đây là để "chứng minh" rằng loại kết quả là chính xác. Bạn có nghĩ câu trả lời sẽ rõ ràng hơn nếu tôi xóa chúng? – paradigmatic

1

Hoặc bạn có thể làm cho điều đó:

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

Trong sự quan tâm của one- tay nghề, tôi phải nói rằng nó có thể được tiếp tục giảm xuống

List("foo","bar").map(telecom(_,0,0)) 
Các vấn đề liên quan