2013-08-19 60 views
5

Tôi đang có một bộ não thực sự rắm ở đây. Tôi đang làm việc với Khung chơi. Tôi có một phương thức lấy một bản đồ và biến nó thành một phần tử chọn HTML. Tôi một lót để lấy danh sách đối tượng và chuyển đổi nó thành bản đồ của hai trường của đối tượng, idname. Tuy nhiên, tôi là một lập trình Java và Scala của tôi là yếu, và tôi đã chỉ đi và quên cú pháp của cách tôi đã làm nó.Cách chuyển danh sách các đối tượng thành bản đồ của hai trường trong Scala

Tôi có một cái gì đó giống như

organizations.all.map {org => /* org.prop1, org.prop2 */ } 

bất cứ ai có thể hoàn thành phần nhận xét?

Trả lời

9

tôi sẽ đề nghị:

map { org => (org.id, org.name) } toMap 

ví dụ

scala> case class T(val a : Int, val b : String) 
defined class T 

scala> List(T(1, "A"), T(2, "B")) 
res0: List[T] = List(T(1,A), T(2,B)) 

scala> res0.map(t => (t.a, t.b)) 
res1: List[(Int, String)] = List((1,A), (2,B)) 

scala> res0.map(t => (t.a, t.b)).toMap 
res2: scala.collection.immutable.Map[Int,String] = Map(1 -> A, 2 -> B) 
+1

và '.toMap', vì loại ban đầu là Danh sách –

+0

Thx cho điều đó. Lưu ý –

+0

Đó là dòng tôi đã quên. Một ngôn ngữ linh hoạt như vậy. – evanjdooner

5

Bạn cũng có thể kéo dài một trung gian List ra khỏi phương trình và đi thẳng đến Map như thế này:

case class Org(prop1:String, prop2:Int) 
val list = List(Org("foo", 1), Org("bar", 2)) 
val map:Map[String,Int] = list.map(org => (org.prop1, org.prop2))(collection.breakOut) 

Sử dụng collection.breakOut như ngầm CanBuildFrom cho phép bạn về cơ bản bỏ qua một bước trong quá trình này nhận được số Map từ số List.

+1

Tôi tìm thấy câu trả lời của bạn ở đây thực sự thú vị, tôi chưa bao giờ nghe nói về breakOut ... fyi một chút thông tin tham khảo cho những người cũng học: http://stackoverflow.com/questions/1715681/scala-2-8-breakout – LaloInDublin

+0

Cám ơn vì sự gợi ý. Tuy nhiên, tôi đã cố gắng sử dụng một biến thể của dòng của bạn 'list.map (org => (org.prop1, org.prop2)) (collection.breakOut)' trong một mẫu scala html nhưng nó trả về một đối tượng kiểu 'scala. collection.immutable.IndexedSeq [(String, String) '. Mã tôi đã sử dụng là 'Organization.all.map (org => (org.id.toString, org.name)) (collection.breakOut)' trong đó 'Organization.all()' là một phương thức Java trả về một 'Danh sách '. – evanjdooner

+1

@evanjdooner, bạn đã nhập val hoặc var bạn đã chỉ định kết quả. Nó phải được gõ một cách rõ ràng cho nó để kết thúc như một bản đồ như ví dụ của tôi cho thấy. – cmbaxter