我有过
(filepaths)
loadData)
)。
我只想读取文件时,我们也需要计算的统计数字。下面的行将遍历这些文件,并返回其名称和文件内容。
for((name, path) <- filepaths) yield (name, loadData(path))是否有可能对LazyList进行这样的理解,从而对loadData-part进行懒惰的评估?
发布于 2020-08-17 13:47:42
for comprehension只是flatMap和map函数组合的语法糖。只需使用map函数就可以做到这一点:
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只在需要下一个元素时才计算。
发布于 2020-08-17 14:09:17
这绝对是可能的。
for ((name, path) <- filepaths) yield (name, loadData(path))只是句法上的糖
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]子集的一种简单方法)。
// assuming that filepaths is an `Iterable[(A, B)]`
filepaths.toMap.mapValues(loadData(_))(请注意,可以省略(_) )。
这将是非严格的(在查找给定的loadData之前它不会调用name),但它不会非常懒惰(没有回忆录:每次查找都会导致loadData调用)。如果你想要最大限度的懒惰,你必须实现你自己的回忆录。
https://stackoverflow.com/questions/63451314
复制相似问题