2017-02-23 58 views
0

我試圖通過 Map [objectid:String,Int]過濾包含對象的Seq [Object],其中Object.id是Map中的一個鍵。如何在Scala中通過Map [String,Int]過濾Seq [Object]?

我想返回一個新的地圖,其中只包含其原始地圖中的對象與他們的Int值。所以函數應該返回Map [Object,Int]

這是我到目前爲止?達到此目的的最佳方法是什麼?

val peopleObjects[Person] = Seq[person1, person2, person3] 

val peopleMap[String, Int] = Map[PersonId, Int] 

peopleObjects.filter(person[Person] => peopleMap.contains) 
+0

我假設你正在編譯錯誤,因爲這不是有效的scala。從修復它們開始(或者如果需要幫助,發佈它們)。 –

回答

1

您的命名選擇有點混亂。我試圖讓它更清楚一些,但是如果idString,它不清楚Int代表什麼。

class Person(val id: String) {} 
val (tom, jan) = (new Person("tom"), new Person("jan")) 
val persons = Seq[Person](tom, jan) 

val idMap = Map[String, Int]("tom"->4, "jan"->2) 

val personMap = persons.filter(p => idMap.contains(p.id)) 
         .map(p => p->idMap(p.id)) 
         .toMap 
personMap(jan) // res0: Int = 2 
+0

非常感謝您讓這個更清楚,如果Seq現在是未來[Seq [Person]],我還需要做些什麼? –

+1

使用'map()'來窺視'Future'。一旦進入,您可以添加對未來的_eventual_結果的進一步處理。 – jwvh

+0

@jwvh什麼是val(tom,jan)? – MotaF

1

我會採取稍微不同的方法。從@jwvh有所借鑑:

case class Person(id: Int, name: String) 
val tom = Person(4, "tom") 
val jan = Person(2, "jan") 
val people: Future[Set[Person]] = Future.successful(Set(tom, jan)) 

val peopleMap = people.map { set => 
    set.map(p => (p -> p.id))(breakOut) 
} 

基本上我覺得case類,尤其是breakOut,真的很有用在這裏。

相關問題