Scala

2013-08-19 29 views
5

'de iki alanlı bir haritaya nesne listesi nasıl dönüştürülür Burada gerçek bir beyin fırtınası yaşıyorum. Play Framework ile çalışıyorum. Bir harita alan ve onu bir HTML seçme elemanına dönüştüren bir metodum var. I , nesnelerin bir listesini almak ve nesnenin alanlarından ikisinin, id ve name bir haritasına dönüştürmek için bir tek liner vardı. Ancak, ben bir Java programcısıyım ve Scala'm zayıftır ve ben sadece nasıl yaptığımın sözdizimini unuttum ve unutmuşum.Scala

Herkes yorumladı bölümünü tamamlamak Can

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

gibi bir şey mi vardı?

cevap

9

önermek olacaktır:

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

ör

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

ve '.toMap', çünkü orijinal türü Liste için –

+0

Thx'dir. Not –

+0

Bu, unuttuğum satır. Böyle esnek bir dil. – evanjdooner

5
Ayrıca denklemin dışına bir aracı List alıp böyle Map düz gidebiliriz

: temelde sürecinde bir adımı atlamak sağlar

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) 

örtük CanBuildFrom olarak collection.breakOut Kullanılması Bir Map'un bir List'dan alınması.

+1

Cevabınızı burada gerçekten ilginç buldum, breakOut'u hiç duymadım ... ayrıca öğrenenler için biraz daha fazla referans bilgisi: http://stackoverflow.com/questions/1715681/scala-2-8-breakout – LaloInDublin

+0

Önerin için teşekkürler. Ancak, bir scala html şablonunda 'list.map (org => (org.prop1, org.prop2)) (collection.breakOut)' satırınızın bir varyantını kullanmaya çalıştım, ancak scala türünde bir nesne döndürür. collection.immutable.IndexedSeq [(Dize, Dize) '. Kullandığım kod, "Organization.all.map (org => (org.id.toString, org.name)) (collection.breakOut)' dır. Burada "Organization.all()", bir Java yöntemidir. bir "Liste " döndürür. – evanjdooner

+1

@evanjdooner, sonucu atama yaptığınız val veya var yazdınız mı? Örnek gösterdiğim gibi bir Harita olarak sonuçlanmak için açıkça yazılmalıdır. – cmbaxter