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 等 的相关文章

  • 如何创建独立的电梯 Web 应用程序?

    如何制作独立的电梯应用程序 使用哪些工具 库 与在某些应用程序服务器中使用 lift 应用程序作为战争相比 性能如何 使用 onejar maven 插件http onejar maven plugin googlecode com svn
  • 如何拦截 Play 2 + Scala 中的所有控制器请求?

    在 Play 2 的 Java 风格中 有全局设置 onRequest http www playframework org documentation 2 0 4 JavaGlobal 可用于拦截所有传入控制器的请求 但在Scala 等效
  • Akka Stream Kafka 与 Kafka Streams

    我目前正在与Akka 流卡夫卡 http doc akka io docs akka stream kafka current home html与卡夫卡互动 我想知道与卡夫卡有什么区别卡夫卡流 https kafka apache org
  • Scala 中的预期开始定义错误

    我正在尝试运行中提供的 Scala 代码这个 math stackexchange 帖子 https math stackexchange com questions 1233656 albert bernard and cheryl po
  • 如何在 scaladocs 中链接另一个对象内的变量?

    要链接另一个类 我可以使用 package Classname 链接函数定义为def也可以 但是尝试链接变量不起作用 我尝试过的 object Foo val BAR 0 object Example Does the thing with
  • 为什么 SimpleDateFormat 解析错误的日期?

    我有字符串格式的日期 我想将其解析为实用日期 var date 03 11 2013 我将其解析为 new SimpleDateFormat MM dd yyyy parse date 但奇怪的是 如果我通过 03 08 201309 hj
  • 使用 Json.format 函数后,如何从客户端发送缺少相应案例类字段的 Json

    我有一个案例类及其伴随对象 如下所示 现在 当我发送没有 id createdAt 和 UpdatedAt 字段的 JSON 时 因为我在其他地方设置了它们 我得到 NoSuchElementException JsError get 错误
  • Play2 - 模板 -> 递增

    如何在 play2 中声明并递增变量 在 scala html 模板 伪代码 counter for l lt list span class span counter 1 你真的需要计数器和递增吗 你可以这样做 for l index l
  • 如何将元组应用于 Scala 中的格式字符串?

    Edit1 我已经看到这个问题了 将函数应用于 Scala 中的元组 https stackoverflow com questions 1987820 applying a function to a tuple in scala 理想情
  • 如何将解析器与不同类型的 Elem 结合起来

    我正在尝试创建一个结合了正则表达式解析器和我拥有的自定义解析器的解析器 我看过Scala 如何组合来自不同对象的解析器组合器 https stackoverflow com questions 2650254 scala how to co
  • Scala 是一个更好的 println

    我经常发现自己在做这样的事情 println foo 当我想做的时候 println foo 编译器不允许这样做 还有 println很拗口 我真的只想说 echo foo 因此 在基础包对象中 我创建了 println 的 echo 版本
  • “代理属性”是好的风格吗?

    我有一个带有字符串属性的类 它实际上是用分隔符连接的几个字符串 我想知道拥有这样的代理属性是否是一种好的形式 public string ActualProperty get return actualProperty set actual
  • Scala - T 类型的参数或 => T

    以下有什么区别吗 def foo s String and def foo s gt String 这两个定义都接受 sss 作为参数 一个论点String is a by value http en wikipedia org wiki
  • 在elastic4s上找不到值索引错误

    我尝试使用以下方法将一些数据索引到弹性搜索弹性4s https github com sksamuel elastic4s API 但我收到编译错误not found value index 这是代码 稍后我会将 js 对象字段映射到弹性搜
  • 不必要的“else”声明[重复]

    这个问题在这里已经有答案了 如您所知 在 Eclipse 中您可以打开 不必要的 else 声明 检查将触发如果 那么 否则提前返回 而且 根据我的经验 使用这样的语句时最可能有两种情况 1 预检查 if validate arg1 ret
  • 是否可以写一个不可变的双向链表?

    我觉得问这个问题有点愚蠢 但我目前正在学习函数式编程并完成了创建单链表的练习 这让我开始思考 是否有可能创建一个不可变的双链表 假设列表 A B 在构造时 A 需要了解 B 但 B 也需要了解 A 我一直在 Scala 中这样做 所以我不确
  • Scala 防止混合的方法

    我想创造以下特征 trait IntSet A extends Traversable A self Product gt def foreach U f A gt U Unit case class AProduct a List Int
  • 如何将编码器作为参数传递给数据帧的 as 方法

    我想通过使用不同的案例类将 dataFrame 转换为 dataSet 现在 我的代码如下所示 case Class Views views Double case Class Clicks clicks Double def conver
  • 如何使用 Spark SQL 解析 JSON 对象数组

    现在 JSON 数据如下 Id 11 data package com browser1 activetime 60000 package com browser6 activetime 1205000 package com browse
  • 如何在 Chisel 中使用另一个寄存器动态索引到一个寄存器

    我正在为我被告知的一种漏斗移位器编写 Chisel 代码 基本上 它获取大小为 m 位的输入并发送大小为 n 位的输出 其中 m 和 n 可以有任何关系 也可以没有关系 我将 m 位字保存在缓冲区中 然后需要动态索引到缓冲区中以获取 n 位

随机推荐

  • 找不到名称“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