android中有类似Immutable-js的库吗?

问题描述 投票:0回答:1

我是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 truthUnidirectional Data Flow原则,需要使用immutable data,在kotlin中通过

val
关键字实现

这个对象的嵌套层次不是特别深,实现的功能是

add
。如果要更新
List
中的一个元素,代码会比较复杂,而且
copy
对象嵌套很深也会造成性能问题

所以,我想要一个像下面这样的方法

doSomeThing
。它创建对象的副本,根据需要修改新对象的属性,并返回这个新对象。

fun addEmployee(employee: Employee) {
  _uiState.update { currentState ->
    doSomeThing {
      currentState.employees.add(employee)
    }
  }
}

就像我之前说的,我是初学者,上面的解决方案可能不是最好的。我的本意其实是为了简化代码的复杂度,所以即使没有这样的第三方库,有其他的方案也可以。

java android kotlin immutability
1个回答
0
投票
buildList {
    addAll(currentState.employees)
    add(employee)
}

Kotlin 已经可以在没有显式突变的情况下做到这一点:

currentState.employees + employee

另外,Kotlin 有

  • List
    MutableList
    Set
    MutableSet
    以及其他集合之间的分离
  • map
    ,
    flatMap
    ,
    reduce
    ,
    fold
    ,
    drop
    ,
    take
  • 的批量操作
  • 无需创建大量副本即可执行多个批量操作的序列

复制一个深度嵌套的对象也会导致性能问题

不多。当您修补一个字段时,副本的其他字段的值仍然指向相同的对象。

© www.soinside.com 2019 - 2024. All rights reserved.