我是android开发初学者,碰巧对前端React开发略知一二
我想找一个像Immutable.js这样实现不可变数据的库,具体见Immutability Helpers,最好是kotlin语言(因为我用的是kotlin数据类),java语言也可以
这个库有一个明显的特点:不可变数据只是最基本的部分,最重要的是提供了可以返回这个数据的修改版本的函数。 Google Guava 不是我要找的库,因为它不提供更改数据的功能。也许我的描述不够清楚,请看下面的一些例子。
假设你有一个巨大的嵌套对象,然后你想修改它的一个属性。
myData.x.y.z = 7;
// or...
myData.a.b.add(9);
看起来问题不大,但实际的编码并没有那么简单。
data class Employee(
val name: String
)
data class Company(
val employees: List<Employee>
)
class MyViewModel : ViewModel() {
// Expose screen UI state
private val _uiState = MutableStateFlow(Company(emptyList()))
val uiState: StateFlow<Company> = _uiState.asStateFlow()
// Handle business logic
fun addEmployee(employee: Employee) {
_uiState.update { currentState ->
currentState.copy(
employees = buildList {
addAll(currentState.employees)
add(employee)
}
)
}
}
}
在实际代码中,基于Single source of truth和Unidirectional Data Flow原则,需要使用immutable data,在kotlin中通过
val
关键字实现
这个对象的嵌套层次不是特别深,实现的功能是
add
。如果要更新List
中的一个元素,代码会比较复杂,而且copy
对象嵌套很深也会造成性能问题
所以,我想要一个像下面这样的方法
doSomeThing
。它创建对象的副本,根据需要修改新对象的属性,并返回这个新对象。
fun addEmployee(employee: Employee) {
_uiState.update { currentState ->
doSomeThing {
currentState.employees.add(employee)
}
}
}
就像我之前说的,我是初学者,上面的解决方案可能不是最好的。我的本意其实是为了简化代码的复杂度,所以即使没有这样的第三方库,有其他的方案也可以。
buildList {
addAll(currentState.employees)
add(employee)
}
Kotlin 已经可以在没有显式突变的情况下做到这一点:
currentState.employees + employee
另外,Kotlin 有
List
和MutableList
、Set
和MutableSet
以及其他集合之间的分离map
, flatMap
, reduce
, fold
, drop
, take
等复制一个深度嵌套的对象也会导致性能问题
不多。当您修补一个字段时,副本的其他字段的值仍然指向相同的对象。