在 Android 应用中的数据 class 模型的 属性 中使用 Kotlin 折叠
Fold with Kotlin in a property of a data class model in an Android app
我不确定标题是否足够清楚,所以我将在这里解释一下:
我有四个型号:
这个模型是我用来解析文件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
中显示 balanceBefore
和 balanceAfter
分别是本次交易前的账户余额和本次交易后的账户余额。
对我来说,这不仅难以理解,而且难以实施。
我考虑过可能在每个事务中实施某种 fold
操作,但我不确定如何仅在 balanceBefore
和 balanceAfter
属性中应用它。
还有其他想法吗?
提前致谢!
好吧,这是某种 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 或任何减少当前事务并映射它的函数。
我不确定标题是否足够清楚,所以我将在这里解释一下: 我有四个型号:
这个模型是我用来解析文件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
中显示 balanceBefore
和 balanceAfter
分别是本次交易前的账户余额和本次交易后的账户余额。
对我来说,这不仅难以理解,而且难以实施。
我考虑过可能在每个事务中实施某种 fold
操作,但我不确定如何仅在 balanceBefore
和 balanceAfter
属性中应用它。
还有其他想法吗? 提前致谢!
好吧,这是某种 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 或任何减少当前事务并映射它的函数。