2016-11-24 44 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))