Могу ли я как-то комбинировать логические и нулевые проверки? Я хотел бы знать, можно ли упростить этот метод kotlin

Я новичок в Kotlin и хотел бы узнать наиболее оптимизированный способ упростить следующий метод.

Если сумма подлежит оплате лицом X, мне нужно вернуть сумму, подлежащую оплате, иначе мне нужно вернуть 0.

В приведенном ниже коде payments — это объект, который может принимать значения NULL. Он содержит retailAmount, который также является объектом, допускающим значение NULL. retailAmount содержит baseCharges, который является двойным. (Также, если payments или retailAmount равны нулю, мне нужно вернуть 0)

// get charges payable by X(Retailer/Shopkeeper/Customer)
fun getChargesPayableByX(personX: String): Double {
    // are charges payable by X(Retailer/Shopkeeper/Customer)?
    if (areChargesPayableByX(personX)) {  
        return payments?.retailAmount?.baseCharges ?: 0.0
    }
    return 0.0
}

person Devenom    schedule 16.07.2019    source источник


Ответы (1)


Вы можете сделать что-то вроде:

fun getChargesPayableByX(personX: String): Double = 
    areChargesPayableByX(personX).takeIf{it == true}?.let{ payments?.retailAmount?.baseCharges } ?: 0.0
person Saeed Entezari    schedule 16.07.2019
comment
Возможно, это будет проще, чем payments?.retailAmount?.baseCharges.takeIf { it != null && areChargesPayableByX(personX) } ?: 0.0 ? - person Yoni Gibbs; 16.07.2019
comment
@YoniGibbs Все, что вам подходит. Это просто разные способы написания одного и того же. На самом деле это не оптимизирует ваш код. - person Saeed Entezari; 16.07.2019
comment
@SaeedEntezari и Yoni Gibbs Благодаря вашим ответам я только что узнал об операторе takeIf. - person Devenom; 17.07.2019