Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Kotlin takeIf与takeUnless

Kotlin开发中与if等价的takeIf与takeUnless详解

作者:须须草

这篇文章主要介绍了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文