gpt4 book ai didi

Scala 风格 : for vs foreach, 过滤器、 map 和其他

转载 作者:行者123 更新时间:2023-12-01 01:05:45 25 4
gpt4 key购买 nike

smth 集合中“高级迭代”的最佳风格是什么?在哪些情况下我应该使用 for-comprehension 以及何时应该寻找替代的迭代方式(就风格而言)。在 Programming in Scala书中有一个与下一个几乎相同的示例:

for{
file <- filesHere
if file.getName.endsWith("txt")
line <- Source.fromFile(file).getLines.toList
if line.trim.matches(pattern)
} println("|" + file + ": " + line.trim)

我尝试使用内部迭代重写它并得到:
filesHere foreach { file =>
if (file.getName.endsWith("txt")) {
Source.fromFile(file).getLines.toList foreach {line =>
if (line.trim.matches(pattern)) println("|" + file + ": " + line.trim)
}
}
}

但是,在网络上(包括stackoverflow)我发现很多文章/帖子都在说服使用for-comprehension,我觉得使用它并不方便。恕我直言,内部迭代更具可读性和方便性。

关于这个主题的最佳指南是什么?

最佳答案

我认为你学习 Scala 很棒。它背后有一个很棒的社区,非常活跃,我认为随着时间的推移,您会对自己的决定越来越满意。

至少就目前而言,我认为您应该坚持使用“Scala 编程”,因为它写得非常好,并且是对该语言的出色介绍。然后,一个很好的地方是 Scala api 文档本身,因为许多类/方法都包含示例代码。此外,谷歌组非常活跃(而且,正如我所说,那里的人非常友好)。

请记住,您作为示例提供的代码不返回任何值,而只会产生副作用(在 Java 中,这将具有 void 返回值)。大多数 Scala API 都面向几乎没有副作用的函数,返回值几乎没有副作用(例如,您可能有日志记录的副作用,但惯用的 Scala 代码将最大限度地减少方法和函数中的副作用)。

在 Scala API 中,如果符合您的需要,有些方法将是首选样式。例如,在 Scheme 中,您可能会执行一个内部循环来进行迭代,而在 Scala 中,它可能如下所示:

val myScores = List(4, 8, 6, 1, 2, 4, 9, 8)

def max(ls: List[Int]): Int = {
def iter(acc: Int, rem: List[Int]): Int = {
if (rem.isEmpty) acc
else if (rem.head > acc) iter(rem.head, rem.tail)
else iter(acc, rem.tail)
}
iter(ls.head, ls)
}

但我不需要写那个函数,因为 max已在列表 API 中实现:
myScores.max

所以,如果你想做的事情已经由一个库实现了,你应该使用它。 max()这是一个简单的例子,但在 Scala API 和 scalaz 中可以找到更复杂的转换。

一个 for -理解(您帖子的原始主题)是 flatMap 的组合, map , 和 filter .如果您正在做一些相当简单的事情,那么两个版本都将具有相同的可读性,但是如果您正在做一个长链 flatMap , map , 和 filter串在一起创建一个复杂的转换,然后是 for - 理解将更具可读性。

编辑:

具体到你的问题,我觉得是 for - 理解版本更容易阅读:
val filterMapFlatmapVersion: List[String] = 
fileNames.filter(_.endsWith("txt")).flatMap { file =>
io.Source.fromFile(file).getLines().toList.map(_.trim).filter(_ == pattern)
}

val forVersion: List[String] =
for {
fileName <- fileNames
if fileName.endsWith("txt")
line <- io.Source.fromFile(fileName).getLines()
if line.trim().matches(pattern)
} yield line.trim

关于Scala 风格 : for vs foreach, 过滤器、 map 和其他,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18877351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com