Scala:var List 与 val MutableList

2024-05-23

在 Odersky 等人的 Scala 书中,他们说使用列表。我还没有从头到尾读过这本书,但所有的例子似乎都使用了 val List。据我了解,还鼓励人们使用 vals 而不是 vars。但在大多数应用程序中,使用 var List 或 val MutableList 之间是否没有权衡?显然,我们会尽可能使用 val 列表。但是使用大量 var 列表(或 var 向量等)是一个好的做法吗?

我是从 C# 开始接触 Scala 的。在那里我有很多:

public List<T> myList {get; private set;}

如果 C# 内置了不变性,那么可以很容易地将集合声明为 val,因为集合本身在构造后永远不会改变,即使在其生命周期内会从集合中添加和删除元素。因此声明一个 var 集合几乎感觉就像远离了不变性一步。

根据回答和评论,Scala 的一大卖点是:它可以带来很多好处,而不必像 Lisp 或 Haskell 那样完全改变人们编写代码的方式。


使用大量 var 列表(或 var 向量)是一个好习惯吗? ETC)?

我想说这是更好的做法var与不可变集合相比,使用val与可变的。从我的头顶上掉下来,因为

  • 您对行为有更多保证:如果您的对象有一个可变列表,您永远不知道其他外部对象是否会更新它

  • 您限制可变性的程度;返回集合的方法将产生一个不可变的集合,因此您只在一个对象内具有可变性

  • 通过简单地将 var 分配给 val 来使 var 不可变很容易,而要使可变集合不可变,您必须使用不同的集合类型并重建它

在某些情况下,例如具有大量 I/O 的时间相关应用程序,最简单的解决方案是使用可变状态。并且在some https://stackoverflow.com/a/10015801/770361在这种情况下,可变的解决方案更加优雅。然而,在大多数代码中,您根本不需要可变性。关键是使用具有高阶函数的集合,而不是循环或递归(如果不存在合适的函数)。这比听起来简单。您只需要花一些时间来了解 List 上的方法(以及其他集合,它们大多是相同的)。最重要的是:

map:将您提供的函数应用于集合中的每个元素 - 使用而不是循环和更新数组中的值

foldLeft:从集合返回单个结果 - 使用而不是循环和更新累加器变量

for-yield表达式:简化映射和过滤,特别是对于嵌套循环类型问题

最终,大部分函数式编程都是不变性的结果,两者缺一不可。然而,局部变量主要是一个实现细节:只要它不能逃离局部范围,一点可变性就没有问题。因此,请将变量与不可变集合一起使用,因为本地变量不会被导出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:var List 与 val MutableList 的相关文章

随机推荐

  • 如何在 Visual Studio 2015 中使用 Angular-Cli 和 ASP.NET Core 设置 asp.net Angular 2 项目?

    我使用 Angular cli 设置了 Angular 2 项目 它非常适合我 有什么方法可以将此项目添加到 Visual Studio 中的 ASP NET Core 中 我会将 Angular 2 项目移动到 ASP NET Core
  • 错误 #520009 - 帐户受到限制

    我收到 520009 错误 帐户 电子邮件受保护 cdn cgi l email protection被限制 当尝试进行并行付款时 我的代码使用沙箱运行良好 但我切换到实时端点 它开始失败 有问题的帐户是有效的 PayPal 帐户 我使用的
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 在 PHP 中将整数转换为十六进制值

    如何将PHP中第一类中的数字转换为第二类中的数字 是否有内置函数来转换数字 也是我的标题 将整数转换为十六进制值 甚至正确 class Permission const READ 1 const UPDATE 2 const DELETE
  • 如何在 Vim 中同时打开多个文件?

    有没有办法从 Vim 中打开目录中的所有文件 所以一个 command这实际上是说 打开下面的所有文件 some path进入缓冲区 理想情况下 递归地打开目录下的所有文件会很棒 您正在寻找的命令是 args 例如 args path to
  • 如何将本地文本文件上传到文本区域(网页内)

    我是一名新手程序员 需要一些帮助来弄清楚如何将本地文本文件上传到我正在构建的网站内的文本区域 我非常精通 HTML CSS 对 Javascript JQuery 有相当的了解 而且我刚刚学习 PHP 您能提供的任何帮助我将不胜感激 我有一
  • 放心 + 模拟 MVC @ControllerAdvice

    在我的项目中 我使用 Rest Assured MockMVC 并具有以下依赖项
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • ResourceVersion 和 Generation 之间有什么区别?

    在 Kubernetes 对象元数据中 有的概念resourceVersion and generation https github com kubernetes community blob master contributors de
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 通过 post 使用 php 发送 XML

    我知道有很多类似的问题 但我尝试过摆弄所有的解决方案 但似乎无法使其发挥作用 我正在尝试将 xml 直接发布到 Web 服务并获得响应 从技术上讲 我正在尝试连接到freightquote com 您可以在右上角找到该文档this http
  • CSS如何制作可滚动列表

    我正在尝试创建一个由标题和标题下方的项目列表组成的网页 我希望项目列表可以垂直滚动 我还希望网页占据整个窗口 但不要更大 目前我的问题是项目列表不可滚动 而是延伸到窗口底部下方很远 这导致窗口可滚动 应该做什么CSS属性位于html bod
  • Magento 重新索引问题

    I am facing one issue in Magento I am having one Magento store with multi website functionality which containing approx
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 如何处理数字逻辑模拟器中的循环?

    我正在开发一个数字逻辑模拟器 以便稍后在其中构建我自己的 CPU 所以这是一个长期项目 对于没有循环的电路 例如全加器 一切都非常有效 还有像 SR 锁存器这样的电路 其中一个门的输入连接到另一个门的输出 所以我陷入了循环 因为两个门都需要
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • Scala:var List 与 val MutableList

    在 Odersky 等人的 Scala 书中 他们说使用列表 我还没有从头到尾读过这本书 但所有的例子似乎都使用了 val List 据我了解 还鼓励人们使用 vals 而不是 vars 但在大多数应用程序中 使用 var List 或 v