Kotlin开发中与if等价的takeIf与takeUnless详解
作者:须须草
一、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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!