在 Android 应用的数据类模型的属性中使用 Kotlin 折叠



我不确定标题是否足够清晰,所以我在这里解释: 我有四种型号:

此模型是我用于从文件中解析 JSON 的模型

@JsonClass(generateAdapter = true)
data class Account(
val account: String,
val balance: String,
val transactions: List<Transaction>
)

Account有一个Transactions列表:

@JsonClass(generateAdapter = true)
data class Transaction(
val id: String,
val amount: String,
val description: String,
val otherAccount: String,
val date: String
)

对于 UI 层,我有一些等效的模型:

data class AccountEntity(
val account: String,
val balance: String,
val transactions: List<TransactionEntity>
)

data class TransactionEntity(
var amount: BigDecimal,
var balanceBefore: BigDecimal,
var balanceAfter: BigDecimal,
val description: String,
val otherAccount: String,
val date: Date
)

我想做的棘手的事情是,Account有一个balance,我需要在每个TransactionData中分别显示balanceBeforebalanceAfter,分别是此交易之前帐户的余额,以及此交易完成后的帐户余额。

对我来说,这不仅有点难以理解,而且难以实施。 我想过也许在每个事务中实现某种fold操作,但我不确定如何仅在balanceBeforebalanceAfter属性中应用它。

还有其他想法吗? 提前非常感谢!

嗯,它是某种reduce/fold函数,也允许你map你的Transaction对象。

此函数的作用是跟踪累加器中的当前余额并转换每个Transaction对象:

inline fun <R> List<Transaction>.map(
initial: Int,
transform: (transaction: Transaction, beforeBalance: Int, afterBalance: Int) -> R
): List<R> {
var accumulator = initial
val destination = ArrayList<R>()
for (transaction in this) {
val after = accumulator - transaction.amount
destination.add(transform(transaction, accumulator, after))
accumulator = after
}
return destination
}

您可以像这样使用它:

account.transactions.map(account.balance, {t, b, a-> TransactionEntity(...)})

为了更通用和更实用,您可以将此行accumulator - transaction.amount移动到函数参数作为折叠输入,并调用函数 foldMap 或任何减少当前事务并映射它的东西。

最新更新