kotlin 擴展函數之Boolean擴展

Kotlin 擴展函數java

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(明文)表達式, 先上代碼和測試用例:markdown

代碼:BooleanEtx.ktide

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,固然在咱們開發中是能夠忽略不計的。測試

相關文章
相關標籤/搜索