kotlin 扩展函数之Boolean扩展

3,073 阅读2分钟

Kotlin 扩展函数

Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式,这样一来,可以为一个你不能修改的、来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用。我们在Android 开发中,对于Android 经常使用的API 都可以结合业务做扩展处理,处理之后即可达到某部分业务相关的API逻辑全盘使用。 比如对于Fragment中ViewMdoel 对象上下文转换的扩展

inline fun <reified T : ViewModel> Fragment.viewModel(
    factory: ViewModelProvider.Factory,
    body: T.() -> Unit
): T {
    val vm = ViewModelProviders.of(this, factory)[T::class.java]
    vm.body()
    return vm
}

今天对我们常用的基本数据类型Boolean进行一个扩展

目的: 能让我们在使用的过程中更加符合阅读的逻辑思维,更加简便,不使用if else(明文)表达式, 先上代码和测试用例:

代码:BooleanEtx.kt

package com.kpa.component.ui.extension

/**
 * @author: kpa
 * @time: 2021/4/17
 * @email: billkp@yeah.net
 **/

/**
 * 数据
 */
sealed class BooleanExt<out T>

object Otherwise : BooleanExt<Nothing>()
class WithData<T>(val data: T) : BooleanExt<T>()

/**
 * 判断条件为true 时执行block
 */
inline fun <T : Any> Boolean.yes(block: () -> T) =
    when {
        this -> {
            WithData(block())
        }
        else -> {
            Otherwise
        }
    }

/**
 * 判断条件为false 时执行block
 * 
 */
inline fun <T> Boolean.no(block: () -> T) = when {
    this -> Otherwise
    else -> {
        WithData(block())
    }
}

/**
 * 与判断条件互斥时执行block
 */
inline fun <T> BooleanExt<T>.otherwise(block: () -> T): T =
    when (this) {
        is Otherwise -> block()
        is WithData -> this.data
    }

测试用例:

@Test
fun addition_isCorrect() {
    true.yes { 
        // doSomething
    }
    false.no{
        // doSomething
    }
    // 有返回值(条件为true)
    val otherwise = getBoolean().yes {
        2
    }.otherwise {
        1
    }
    assertEquals(otherwise, 2)
    // 有返回值(条件为false)
    val otherwise1 = false.no {
        2
    }.otherwise {
        3
    }
    assertEquals(otherwise1, 2)
}


fun getBoolean() = true

总结:

这样就能在工作中直接根据业务去写对应的逻辑了,并且使用了inline函数,所以在字节码层面我们还是if else 的,所以不需担心安全问题,简化了代码,唯一添加的开销就是创建数据返回类WithData,当然在我们开发中是可以忽略不计的。