【问题标题】:Scala: Converting for expression to higher order functionScala:将表达式转换为高阶函数
【发布时间】:2018-04-05 10:08:48
【问题描述】:

我正在尝试将 for 表达式转换为高阶函数的 Scala 练习 - flatMap、filter 和 map。 我不明白 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

高阶函数:

books flatMap(book =>
    book.authors filter(name => name startsWith("Aavik")) map(_ => book.title))

地图的输入是 List("Aavik"),地图与 book.title 有什么关系?

【问题讨论】:

  • 您的平面地图涵盖了所有内容。您的地图位于 flatMap 内部,因此在其中的任何位置,您都在处理一本书,您可以通过 book 变量访问它

标签: scala


【解决方案1】:

@Aavik 请阅读How does yield work? 文章。

您的示例的脱糖版本如下所示:

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 { _ =&gt; book.title }book 变量具有相同的范围。您可以在Scastie 中运行此示例。

Ammonite REPL desugar 可以帮助研究 Scala 如何翻译理解。

【讨论】:

  • 嗨 Ivan,scala 的帮助。我想比较 2 个 hdfs 文件,并想使用我在 google 中看到的 using 方法。我已经开发了代码,但不知道如何进一步进行。我已标记为带有标题 Scala 的 scala - 比较 2 个 hdfs 文件 stackoverflow.com/questions/50861553/scala-compare-2-hdfs-files
【解决方案2】:

如果我的问题是正确的,在上面的例子中,即

   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))))

所以,如您所见,我们有 book 作为 flatMap 的输入,可以在其中的任何位置访问它。因此,在 map 中访问 book.title 没有问题,因为 map 包含在 flatMap 中。

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

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多