gpt4 book ai didi

kotlin - 如何跨多个异步源收集具有不变属性的kotlin数据类的数据?

转载 作者:行者123 更新时间:2023-12-02 13:28:28 24 4
gpt4 key购买 nike

我需要从两个或多个异步源收集数据,对其进行一些按摩,然后返回结果。

data class Result(
var foo1: String?,
var foo2: Int?,
var bar1: Boolean?,
var bar2: List<Boolean>?
)

fun getData(): Single<Result> {

val res = Result(null, null, null, null)

return getFoo()
.map { /* update res.foo1 and res.foo2 */ }
.flatMap {
getBar().map { /* update res.foo1 and res.foo2 */ }
}
}
必须按顺序调用 getFoo()getBar(),因为 foo的结果可能会影响 bar的结果。
由于 foo1foo2bar1bar2只能初始化一次,因此感觉有某种方法可以使它们成为不变的 val,因此我不必担心会意外更改它们。
我可以为 getFoo()制作一个“中间”数据类,该数据类仅具有 foo属性,然后在最后使用它来构造 Result。但是在有N个调用分别更新1-2个属性的情况下,创建N + 1个非常相似的数据类非常繁琐。
有什么方法可以避免创建“中间”数据类,同时又避免使用可变的类属性?

最佳答案

另一种方法是使用构建器模式。
使用这种方法在每个点上,都可以聚合变量,直到构造所有变量为止。
然后调用build方法来创建Result数据类

class ResultBuilder(
var foo1: String? = "", var foo2: Int? = -1, var bar1: Boolean? = false, var bar2: List<Boolean>? = emptyList()
) {
fun build(): Result {
return Result(foo1, foo2, bar1, bar2)
}
}

suspend fun <V> getFoo(): V {
TODO()
}

suspend fun <T> getBar(): T {
TODO()
}

fun getData(): Single<Result> {
val result = ResultBuilder()
return result.apply {
getFoo().map { fooResult ->
this.foo1 = fooResult.first
this.foo2 = fooResult.second
}.flatMap {
getBar().map { barResult ->
this.bar1 = barResult.first
this.bar2 = barResult.second
}
}
}.build()
}

关于kotlin - 如何跨多个异步源收集具有不变属性的kotlin数据类的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62945844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com