首頁 > 軟體

Kotlin開發中與if等價的takeIf與takeUnless詳解

2023-10-31 22:00:32

一、takeIf與takeUnless簡介

if差不多等價的是takeIf和takeUnless,為什麼要使用這兩個關鍵字?

為了簡化程式碼!!

使用if語句實現程式碼比較繁瑣一點,但使用if語句同樣可以實現同樣的效果。

簡化程式碼如下:

fun CheckMyTakeIf(value :Boolean):Boolean = value
fun main()
{
	//使用了takeIf簡化了程式碼
	var lll :String?= name.takeIf{
	        CheckMyTakeIf(true)
	    }
	print(lll)
}

未簡化程式碼如下:

fun CheckMyTakeIf(value :Boolean):Boolean = value
fun main()
{
	//未簡化程式碼
	var lll :String? = null
	if(CheckMyTakeIf(true))
	    lll = name
	else
	    lll = null
	print(lll)
}

二、關鍵字takeIf

如果是括號{}內最後一行執行返回的是true,則返回的自身it?

如果是括號{}內最後一行執行返回的是false,則返回的自身null

fun CheckMyTakeIf(value :Boolean):Boolean = value
fun main()
{
    var name :String? = "你好"
    var lll = name.takeIf {
        CheckMyTakeIf(true)
        CheckMyTakeIf(false) //最後返回false,所以返回空null
    }
    println(lll)
    lll = name.takeIf{
        CheckMyTakeIf(false) 
        CheckMyTakeIf(true)  //最後返回ture,所以返回自身,自身就是name字串
    }
    println(lll)
}

IntelliJ IDEA 2021.3.2 (Community Edition)

開發軟體執行結果:

三、關鍵字takeUnless

fun CheckMyTakeIf(value :Boolean):Boolean = value
fun main()
{
    var name :String? = "你好"
    var lll = name.takeUnless {
        CheckMyTakeIf(true)
        CheckMyTakeIf(false)
    }
    println(lll)
    lll = name.takeUnless{
        CheckMyTakeIf(false)
        CheckMyTakeIf(true)
    }
    println(lll)
}

IntelliJ IDEA 2021.3.2 (Community Edition)

開發軟體執行結果:

四、Android官方程式碼低功耗藍芽程式碼

private val BluetoothAdapter.isDisabled: Boolean
    get() = !isEnabled
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
bluetoothAdapter?.takeIf { it.isDisabled }?.apply {
    val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}

上面先是弄個一個相反的變數

private val BluetoothAdapter.isDisabled: Boolean
    get() = !isEnabled

也就是說呼叫BluetoothAdapter.isEnabled和BluetoothAdapter.isDisabled是取反的效果

接下來就是

bluetoothAdapter?.takeIf { it.isDisabled }?.apply {
    val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}

這段程式碼怎麼看呢?從左往右

1、先是bluetoothAdapter?如果為空,右邊式子.takeIf { it.isDisabled }?.apply…就不會執行

2、如果bluetoothAdapter?不為空,那麼執行.takeIf { it.isDisabled }?部分的程式碼

3、takeIf { it.isDisabled }?為空,即it.isDisabled為false,那麼右邊式子**.apply{ }**內建函數程式碼就不會執行。

4、takeIf { it.isDisabled }?不為空,即it.isDisabled為true,就是返回自身,那麼右邊式子.apply{}內建函數程式碼就執行。

private val BluetoothAdapter.isDisabled: Boolean
    get() = !isEnabled
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
bluetoothAdapter?.takeIf { it.isDisabled }?.apply {
    val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}

現在將takeIf替換成takeUnless上面一段程式碼等價於下面一段程式碼

bluetoothAdapter?.takeUnless { it.isEnabled }?.apply {
    val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}

到此這篇關於Kotlin開發中與if等價的takeIf與takeUnless詳解的文章就介紹到這了,更多相關Kotlin takeIf與takeUnless內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com