问题标签 [immutable-collections]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6282 浏览

java - 在不破坏不变性的情况下更新不可变对象

如何在不破坏不变性的情况下从另一个不可变对象获取更新的不可变对象。类似于在 Scala 中实现事物的方式或在 Immutables 库中实现事物的方式。

我怎样才能实现类似 Customer.Builder.from(anotherCustomer).replaceOrder(oldOrder,newOrder).with(newName).build()

重用旧对象并将我想要的所有更改排队以构建新对象。

我正在使用 Java。

0 投票
2 回答
194 浏览

c# - ImmutableList 是否有类似 AsReadOnly 的方法?

AsReadOnly() 是获取集合的只读图像(与不可变集合的副本相比并不昂贵)的便捷方法。我想知道 ImmutableList 是否有类似 AsReadOnly 的方法?如果没有,有什么简单的方法可以实现类似的吗?

0 投票
1 回答
972 浏览

c# - 为什么 ImmutableList 的 add 方法复杂度为 O(logN)?

我认为创建了一个包含 N+1 个项目的新 ImmutableList。因此它的复杂度应该是 O(N)。

0 投票
2 回答
1333 浏览

scala - Scala不可变集是可变的?

文档说:

scala.collection.immutable 包中的集合保证对每个人都是不可变的。这样的集合在创建后永远不会改变

但我没有得到我期望的行为:

我在这里想念什么?

0 投票
0 回答
176 浏览

.net - 为什么是不可变字典实现字典?

它看起来像一个奇怪的设计选择,因为 aDictionary和 anImmutableDictionary在写入方面完全不同。(阅读方面,他们都实现了IReadOnlyDictionary,这很好*)

实际上,类IDictionary<TKey, TValue>.Add()中的当前实现ImmutableDictionary会抛出一个NewSupportedException.

那么,这样做的意义何在?例如,如果一个方法返回一个IDictionary实际上是一个 的方法ImmutableDictionary,那么在其中添加元素时就会遇到一些麻烦。

*接口名称除外,有待商榷

0 投票
1 回答
565 浏览

c# - 尝试使用 AutoMapper 映射 ImmutableDictionary 时出错

我想将 POCO 映射到一个并且AutomapperImmutableDictionary<string, object>引发异常,因为.AddImmutableDictionary

POCO 对象位于源类型中调用的属性中Data,该属性映射到DataBag目标中的属性。Data目前尚不清楚该类型。

我正在使用这个映射:

并收到此错误:

为了解决这个问题,我尝试使用自定义解析器:

使用此映射:

但我仍然遇到同样的错误。在第二种情况下,它抱怨:

0 投票
3 回答
1293 浏览

c# - 创建一个在编译时未知的类型的 ImmutableList

给定 aCollection<T>其类型T仅在运行时(而不是在编译时)已知,我想生成一个ImmutableList<T>.

我想创建的方法可能像:

其中 originalList 是IEnumerable,type 是T生成的ImmutableList<T>.

如何?!

(我正在使用 NET .Core)

编辑:感谢评论,我找到了一个可行的解决方案。它使用 AddRange 方法。

0 投票
9 回答
17734 浏览

java - 返回 ImmutableMap 还是 Map 更好?

假设我正在编写一个应该返回Map的方法。例如:

考虑了一会儿,我决定一旦创建了这个 Map 就没有理由修改它。因此,我想返回一个ImmutableMap

我应该将返回类型保留为通用 Map,还是应该指定返回 ImmutableMap ?

从一方面来看,这正是创建接口的原因;隐藏实现细节。
另一方面,如果我这样保留它,其他开发人员可能会错过这个对象是不可变的这一事实。因此,我不会实现不可变对象的主要目标。通过最小化可以更改的对象的数量来使代码更清晰。更糟糕的是,一段时间后,有人可能会尝试更改此对象,这将导致运行时错误(编译器不会对此发出警告)。

0 投票
3 回答
4891 浏览

java - 用于 Guava 不可变表的 Java 8 收集器

用例:
通过返回ImmutableTable类型的方法处理字符串列表{R,C,V}。例如ImmutableTable of {Integer,String,Boolean} process(String item){...}

收集结果,即合并所有结果并返回ImmutableTable。有没有办法实现它?

当前实施(如 Bohemian 建议的那样):

使用并行流怎么样?下面的代码中是否存在任何并发问题?使用并行流,我在 tableBuilder.build() 上得到“索引 1800 处的 NullPointerException”,但与流一起工作正常。

虽然下面的代码适用于流以及并行流。但是由于行和列的重复条目,ImmutableBuild 失败了。合并表时防止重复的最佳方法是什么?

编辑:如果在合并不同的表时 ImmutableTable.Builder 中有任何重复的条目,那么它会失败,

试图通过将 ImmutableTables 放入 HashBasedTable 来避免错误

但我收到运行时异常“由:java.lang.IllegalAccessError:试图访问类 com.google.common.collect.AbstractTable 引起”。

我们如何使用 HashBasedTable 作为累加器来收集 ImmutablesTables,因为 HashBasedTable 用最新的条目覆盖现有条目,并且如果我们尝试放置重复条目并返回聚合的不可变表,则不会失败。

0 投票
2 回答
1804 浏览

c# - C# 安全地返回字典引用

我正在考虑三种方法来返回对内部 Dictionary 实例 (C#) 的引用,这些方法涉及代码安全性以及对我正在处理的项目的代码可读性/视觉上的影响。

我已将其缩小到以下三种方法,但我愿意接受更好的建议。目前我更喜欢#3作为没有额外样板的最佳安全平衡。

1)使用第二个 ReadOnlyDictionary 实例来包装内部字典,只让 ReadOnlyDictionary 转义类:

2)将 Dictionary 实例作为 IReadOnlyDictionary 返回,但重铸将允许对其进行修改,因此不如选项 #1 或 #3 安全。

3)当 Dictionary.ToImmutableDictionary() 转义包含类时,将 Dictionary.ToImmutableDictionary() 作为 ImmutableDictionary 返回,以便返回的对象是内部字典的不可变视图,尽管这将为每次调用创建一个新副本,从而产生更高的成本,这应该没问题带有简单的小字典(我的字典)。