Kotlin 在StateFlow中操作集合的正确方法

Kotlin 在StateFlow中操作集合的正确方法,kotlin,collections,kotlin-flow,Kotlin,Collections,Kotlin Flow,我创建的可变状态流如下所示: val intSet = MutableStateFlow(HashSet<Int>()) 这似乎不起作用(收集更新了,但没有通知观察者)。 我发现它工作的方式: val list = HashSet<Int>(intSet.value) list.add(0) intSet.value = list val list=HashSet(intSet.value) 列表。添加(0) intSet.value=list 但它创建了该收藏的副

我创建的可变状态流如下所示:

val intSet = MutableStateFlow(HashSet<Int>())
这似乎不起作用(收集更新了,但没有通知观察者)。 我发现它工作的方式:

val list = HashSet<Int>(intSet.value)
list.add(0)
intSet.value = list
val list=HashSet(intSet.value)
列表。添加(0)
intSet.value=list

但它创建了该收藏的副本,所以它看起来不适合我。有没有更简单的方法来更新StateFlow中的集合?

MutableFlow
不检查集合内容的更改。只有当集合引用发生更改时,它才会发出更改

使用不可变的
Set
并使用
+=
操作符添加新元素。这将基本上创建新的
Set
,并触发更改

val intSetFlow=MutableStateFlow(setOf())
intSetFlow.value+=0

MutableFlow
不检查集合内容的更改。只有当集合引用发生更改时,它才会发出更改

使用不可变的
Set
并使用
+=
操作符添加新元素。这将基本上创建新的
Set
,并触发更改

val intSetFlow=MutableStateFlow(setOf())
intSetFlow.value+=0

,它不会创建集合的副本。它将同一集合实例设置为属性。无论如何,在大多数情况下,我认为拥有一个可变集合流是一个糟糕的设计,因为该行为对收集器来说是不明确的,收集器无法确定是否允许缓存值、修改内容,或者是否可以依赖保持不变的内容。这并不是创建集合的副本。它将同一集合实例设置为属性。无论如何,在大多数情况下,我认为拥有可变集合流是一种糟糕的设计,因为该行为对收集器来说是不明确的,收集器无法确定是否允许缓存值、修改内容,或者是否可以依赖保持不变的内容。
val list = HashSet<Int>(intSet.value)
list.add(0)
intSet.value = list