Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:将for表达式转换为高阶函数_Scala - Fatal编程技术网

Scala:将for表达式转换为高阶函数

Scala:将for表达式转换为高阶函数,scala,Scala,我正在尝试Scala练习,其中for表达式转换为高阶函数-flatMap、filter和map。 我不明白映射的输入(List(author1,author2))是如何翻译成book.title的 输入: val books:List[Book] = List( Book(title = "kids watching", authors = List("Aavik","Arjun")) ) 表达方式: for{ book <- books name <-

我正在尝试Scala练习,其中for表达式转换为高阶函数-flatMap、filter和map。 我不明白映射的输入(List(author1,author2))是如何翻译成book.title的

输入:

val books:List[Book] = List(
    Book(title = "kids watching", authors = List("Aavik","Arjun"))
  )
表达方式:

for{
    book <- books
    name <- book.authors
    if name.startsWith("Aavik")
  } yield book.title
地图的输入是列表(“Aavik”),地图与书的关系如何?

@Aavik请阅读文章

示例的脱胶版本如下所示:

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

val books: List[Book] = List(
    Book(title = "kids watching", authors = List("Aavik","Arjun"))
  )

books.flatMap { (book: Book) => 
  book.authors.withFilter { (name: String) =>
    name.startsWith("Aavik")
  }.map { _ =>
    book.title
  }
}
如您所见,
map{{{u=>book.title}
的作用域与
book
变量的作用域相同。您可以在中运行此示例


可以帮助调查Scala是如何翻译理解的。

如果我没有弄错你的问题,在上面的示例中,即

   for{
    book <- books
    name <- book.authors
    if name.startsWith("Aavik")
  } yield book.title
所以,正如你们所看到的,我们有一本书,它是平面图的输入,可以在里面的任何地方访问。因此,在地图中访问book.title没有问题,因为地图被封装在平面地图中


如果您想更清楚,请告诉我。

您的平面图涵盖了所有内容。您的地图位于flatMap中,因此在其中的任何一点上,您都在处理一本书,您可以通过scala中的帮助书variableHi Ivan访问它。我想比较2个hdfs文件,并想使用我在google中看到的使用方法。我已经开发了代码,但不知道如何继续。我已经标记为scala,标题为scala-compare 2 hdfs文件。
   for{
    book <- books
    name <- book.authors
    if name.startsWith("Aavik")
  } yield book.title
books.flatMap(((book) => book.authors.withFilter(((name) => name.startsWith("Aavik"))).map(((name) => book.title))))