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

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

我不确定标题是否足够清楚,所以我在这里解释:我有四个模型:

此模型是我用来从文件中解析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属性中应用它。

还有其他想法吗?在此先多谢!

android kotlin fold
1个回答
0
投票

嗯,这是某种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函数或任何可减少当前事务并映射它的函数。

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