首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将理解转换为LazyList

将理解转换为LazyList
EN

Stack Overflow用户
提问于 2020-08-17 12:58:08
回答 2查看 450关注 0票数 0

我有过

(filepaths)

  • a方法的一个列表,它读取和处理一个文件(loadData)

  • a方法,用于计算该文件的统计信息(

)。

我只想读取文件时,我们也需要计算的统计数字。下面的行将遍历这些文件,并返回其名称和文件内容。

代码语言:javascript
复制
for((name, path) <- filepaths) yield (name, loadData(path))

是否有可能对LazyList进行这样的理解,从而对loadData-part进行懒惰的评估?

EN

回答 2

Stack Overflow用户

发布于 2020-08-17 13:47:42

for comprehension只是flatMapmap函数组合的语法糖。只需使用map函数就可以做到这一点:

代码语言:javascript
复制
def loadData(path: String): String = {
  println(s"launch loadData on $path")
  s"${path}_suffix"
}

val filePaths = Seq("p1" -> "path1", "p2" -> "path2")
val lazyList = filePaths.to(LazyList).map{
  case (name, path) => name -> loadData(path)
}
println(lazyList)
println(lazyList.force)

// output will be:
//LazyList(<not computed>)
//launch loadData on path1
//launch loadData on path2
//LazyList((p1,path1_suffix), (p2,path2_suffix))

在这里,我们看到loadData只在需要下一个元素时才计算。

票数 4
EN

Stack Overflow用户

发布于 2020-08-17 14:09:17

这绝对是可能的。

代码语言:javascript
复制
for ((name, path) <- filepaths) yield (name, loadData(path))

只是句法上的糖

代码语言:javascript
复制
filepaths.map { x =>
  val (name, path) = x
  (name, loadData(path)
}

(这可能不是编译器真正将其分解到的(我忘记了是否会有多个函数(一个用于提取对,另一个用于调用loadData) )

因为LazyList上有一个LazyList,如果filepaths是一个LazyList,它就能工作。

尽管如此,这并不是最大的懒惰:要获得nth条目需要评估(n - 1)第th条目。

当然,只要您有一个Seq[(A, B)] (或Iterable[(A, B)]/ Traversable[(A, B)]),就值得考虑您真正想要的是Function1[A, B]还是Map[A, B] (可以认为这是构造Function[A, B]子集的一种简单方法)。

代码语言:javascript
复制
// assuming that filepaths is an `Iterable[(A, B)]`
filepaths.toMap.mapValues(loadData(_))

(请注意,可以省略(_) )。

这将是非严格的(在查找给定的loadData之前它不会调用name),但它不会非常懒惰(没有回忆录:每次查找都会导致loadData调用)。如果你想要最大限度的懒惰,你必须实现你自己的回忆录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63451314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档