Scala 风格:for 与 foreach、filter、map 等

2024-07-03

scala 中对集合进行“高级迭代”的最佳风格是什么?在什么情况下我应该使用 for-compression,什么时候我应该寻找替代的迭代方式(就风格而言)。在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-communion的文章/帖子,我觉得使用它并不方便。恕我直言,内部迭代非常可读且方便。

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


我认为你学习 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

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

EDIT:

具体到你的问题,我认为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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 风格:for 与 foreach、filter、map 等 的相关文章

随机推荐

  • 找不到名称“HammerManager”

    我在用 角 2 0 0 rc 5 angular2 材料2 0 0 alpha 7 4 Angular CLI 1 0 0 beta 11 webpack 2 当我尝试编译时 它会抛出错误 找不到名称 HammerManager 请参阅随附
  • 停止 HighCharts 在悬停时增加线条宽度

    我正在使用最新版本的 HighCharts 来构建具有多种趋势的图表 默认情况下 当用户鼠标悬停在线条上时 HighCharts 会增加线条的粗细 线宽 因为图表上可能有大约 10 个趋势 所以我想删除此功能 这意味着线条的粗细在悬停时不会
  • 如何调用 Documents.open 并避免出现“文件正在使用”对话框?

    我正在写一些非常简单的代码 https github com tobya DocTo打开 Word 文档 将其保存为新格式并关闭文档 但是 如果文档处于锁定状态并出现 文件正在使用 对话框 我会遇到问题 现在我很高兴自动选择选项 1 或 3
  • 如何验证数据框中依赖于该特定行中其他值的值?

    假设我有一个遵循以下格式的 csv 姓名 薪资 部门 必填 Rob 5500 航空 是 鲍勃 1000 设施 否 汤姆 6000 IT 是 将其导出到 pandas modin 后 我想执行行区分检查 其中 从事航空工作的名叫 Rob 的人
  • 在 Eclipse CDT 中重构 C++

    我已经安装了 Galileo 版本 Eclipse 3 5 CDT 5 1 希望能够利用中提到的更好的重构支持 Eclipse 中 C 重构支持的状态如何 https stackoverflow com questions 130913 w
  • 向 Angular 应用程序添加多个 HTTP 拦截器

    如何向 Angular 4 应用程序添加多个独立的 HTTP 拦截器 我尝试通过扩展来添加它们providers具有多个拦截器的数组 但真正执行的只有最后一个 Interceptor1被忽略 NgModule declarations im
  • 如何解释 TensorFlow 输出?

    如何解释 TensorFlow 输出以在 GPGPU 上构建和执行计算图 给定以下命令 该命令使用 python API 执行任意张量流脚本 python3 tensorflow test py gt 输出 第一部分stream execu
  • 如何使用git中的标签来管理软件版本[重复]

    这个问题在这里已经有答案了 我们使用 git 来管理我们的项目 每个项目都有一个分支 开发者 分期 生产 我想使用 git 标签来管理软件的版本 据我所知 我是否在分支上并添加了一些提交 然后我必须运行 git标签1 0 将 1 0 替换为
  • Firebase 实时数据库当前给出 TRIGGER_PAYLOAD_TOO_LARGE 错误

    从今天早上开始 我们的 Firebase 应用程序出现了问题writing数据到实时数据库实例 即使是最简单的任务 例如向对象添加一个键值对也会触发 Error TRIGGER PAYLOAD TOO LARGE This request
  • 如何在 NHibernate 中热切加载关联而不重复?

    我需要加载一个非常大的对象列表 其中包含很多子对象和子对象的子对象 最好采取什么方法 我正在使用 Oracle 11g 数据库 并且编写了以下方法 但它会产生笛卡尔积 重复的结果 public IList
  • stdatomic (C11),关于 _Atomic 类型的三个问题

    第一个问题 我在 cppreference 上找到了 Atomic type name 自 C11 起 用作类型说明符 这指定了一个新的原子类型 Atomic type name 2 自 C11 起 用作类型限定符 这指定类型名称的原子版本
  • 如何在没有express.js的情况下使用jade渲染部分内容?

    我找到的唯一信息是 http forrst com posts Node js Jade Import Jade File CZW http forrst com posts Node js Jade Import Jade File CZ
  • C# 加载 XML 文件

    如何使用 XML 文档提供的属性创建 Windows 窗体 这是这样一个 XML 文档
  • 转换html5视频-使用什么软件

    我们计划在网站上使用全屏 html5 视频 我读到 MPEG 4 H 264 可能是目前最好的格式 我有 1080p mp4 格式的视频文件 大小为 41 2mb 由于视频应该以 相对 良好的质量播放并且传输速度非常快 因此我如何优化视频文
  • 我可以在商业应用程序中使用免费的 SQL Server Express [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 比较跨多个数据库的存储过程 (SQL Server)

    SQL 大师 我们的架构由多个客户数据库和一个公共代码库组成 当我们部署数据库更改时 必须针对每个数据库运行脚本 由于部署问题 我们的存储过程有时会彼此不同步 我想创建一个脚本来返回这些不匹配的过程 以确保我们在部署后拥有数据库的同步副本
  • 当您在标题搜索路径中选中“递归”时,这意味着什么

    我已经引用了很多项目 并且通过在标题搜索路径中添加它们的路径来做到这一点 我一直在通过 参考项目 入门来跟踪参考内容 例如包括 ZXingWidget 而且我现在已经做了很多 但我不明白递归的检查 这是什么意思 我什么时候检查 递归 路径
  • 将复选框值传递给 Angular 的 ng-click

    有没有办法将相关输入的值传递给角度指令 ng click 换句话说 应该用什么来代替this value在下面的
  • 使用 ng-options 上的过滤器来更改显示的值

    我有一系列价格 0 0 99 1 99 等 我想显示在
  • Scala 风格:for 与 foreach、filter、map 等

    scala 中对集合进行 高级迭代 的最佳风格是什么 在什么情况下我应该使用 for compression 什么时候我应该寻找替代的迭代方式 就风格而言 在Programming in Scala书中有一个例子 看起来几乎和下一个一样 f