2016-11-24 74 views
1

我有一個書單:Scala的for循環高階函數

case class Book(name:String,authors:List[String]) 

val books:List[Book] = List(
       Book(name="Code in Scala",authors=List("Viny","Vinay")), 
       Book(name="Dance in 30 days",authors=List("Namratha","Namitha")), 
       Book(name="Cook in 30 days",authors=List("Pavan")), 
       Book(name="Gym in 30 days",authors=List("Nisanth","Vinay")) 
       ) 

現在我想知道作者的名字與「輸入電壓」開頭的書籍。 我已經實現了這個for循環象下面這樣:

for(b<-books ; a <- b.authors ; if a.startsWith("Vin")) yield b.name 

,但我無法用高階函數來實現這一點。 我試過如下:

books flatMap (b=> b.authors.withFilter(a=>a.startsWith("Vin")).map(x=>x)) 

這讓我對作者的姓名,但我無法訪問我的書object.how解決這個問題?這裏 主要目標是轉換/翻譯了「循環」到高階函數(flatmap /過濾/圖)

+0

如果你想從第二個代碼示例,你會得到書對象中刪除name屬性。你能用高階函數來展示你的代碼嗎? – Pavel

回答

2

我認爲你正在尋找將理解轉換爲組合器(map,flatmapfilterwithFilter))。

你幾乎在那裏。缺少的部分是通過權利範圍訪問書對象:

books.flatMap(b => b.authors.withFilter(a => a.startsWith("Vin")).map(_ => b.name)) 

的規則在Scala language Specification(該文檔中,PDF- 97的第89)解釋

0

我覺得flatMap是不必要在這裏:

scala> books.filter(_.authors.exists(_.startsWith("Vin"))).map(_.name) 
res4: List[String] = List(Code in Scala, Gym in 30 days) 
+0

謝謝你的回答,但我正在研究如何將for循環邏輯實現/翻譯成高階函數(地圖/平面地圖/過濾器)。這是coursera課程的一部分。第二個想法是你的解決方案也使用更高階的功能只。 –

+1

我不認爲你可以使用高階函數**編寫代碼**。你總是需要一些一階函數,否則你會傳遞給高階函數什麼? –

1

只要改變最後map到回到你想要什麼:

books flatMap (b => b.authors.withFilter(a => a.startsWith("Vin")).map(_ => b.name))