Сложите с Kotlin в свойстве модели класса данных в приложении Android - PullRequest
0 голосов
/ 29 сентября 2019

Я не уверен, что заголовок достаточно проясняется, поэтому я объясню здесь: у меня есть четыре модели:

Я использую эту модель для анализа 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
)

Для слоя пользовательского интерфейса у меня есть несколько эквивалентных моделей:

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.

Есть еще идеи?Заранее большое спасибо!

1 Ответ

2 голосов
/ 29 сентября 2019

Ну, это какая-то функция 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 или любую другую, которая уменьшит вашу текущую транзакцию, а также отобразит ее.

...