kotlin简化简化代码

文章介绍了如何使用Kotlin的takeIf函数、Map.containsKey方法以及高阶函数all和any来简化代码,提高可读性和效率。例如,takeIf可以避免NPE异常并根据条件返回值;Map.containsKey能直接获取默认值;all和any则分别用于检查集合中所有元素是否都满足条件或至少有一个满足条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例子1(takeIf())

简化前

    private fun getMainTabGap(): Long {
        return if (cacheKeyHandler != null && cacheKeyHandler!!.getMainTabGap() > 0) {
            cacheKeyHandler!!.getMainTabGap()
        } else {
            normalGap  //默认5分钟
        }
    }

简化后

    private fun getMainTabGap(): Long = cacheKeyHandler
        ?.getMainTabGap()
        ?.takeIf { it > 0 }
        ?: normalGap  //默认5分钟

知识点

  • 首先使用安全操作符 ?. 以避免抛出 NPE 异常
  • 使用 Kotlin 的扩展库函数 takeIf(),它接受一个Lambda表达式,只有在表达式的结果为 true 时才继续执行。如果表达式的结果是 false,takeIf() 会返回null

例子2(Map.containsKey)

简化前

        val lastClickTime = if (lastRouteTime.containsKey(router)) {
            lastRouteTime[router] ?: 0L
        } else {
            0L
        }

简化后

 val lastClickTime = lastRouteTime[router] ?: 0L

知识点

  • 可以直接使用 lastRouteTime[router] 获取可空对象来简化代码
  • 在 Kotlin 的 Map 类型中,如果该 key 在 map 中未定义,则获取到的是 null,因此可以直接使用 Elvis 运算符 ?: 来设置默认值,该方式代码更加简洁易读。

例子3(高阶all)

简化前

    /**
     * 请求头必要参数 - 配置
     * return true: 有必要参数
     */
    private fun essentialHeaders(headers: Map<String, String>?, configKeys: List<String>?): Boolean {
        if (configKeys.isNullOrEmpty() || headers.isNullOrEmpty()) {
            return false
        }
        if (headers.keys.containsAll(configKeys)) {
            // 遍历必要参数列表中的每个key,检查其value是否不为空
            configKeys.takeIf { it.isNotEmpty() }?.forEach {
                if (headers[it].isNullOrBlank()) {
                    return false
                }
            }
            return true
        } else {
            return false
        }
    }

简化后

 	/**
     * 请求头必要参数 - 配置
     * return true: 有必要参数
     */
     private fun essentialHeaders(headers: Map<String, String>?, configKeys: List<String>?): Boolean {
    	return !configKeys.isNullOrEmpty() 
           		&& !headers.isNullOrEmpty() 
           		&& configKeys.all { 
           			headers[it]?.isNotBlank() == true 
           		}
	}

知识点

  • 高阶函数all。all 函数会遍历集合中的每个元素,并根据给定的条件判断是否所有元素都满足该条件。如果集合中的所有元素都满足条件,则返回 true,否则返回 false。
  • 在使用时,根据具体的需求来选择使用 any 还是 all。如果只需要判断集合中是否存在满足条件的元素,使用 any;如果需要判断集合中的所有元素是否都满足条件,使用 all。

例子4(高阶any)

简化前

	/**
     * 请求头是否有非必要参数 - 配置
     * return true: 有非必要参数
     */
    private fun forbiddenHeaders(headers: Map<String, String>?, configKeys: List<String>?): Boolean {
        if (headers.isNullOrEmpty()) {
            return true
        }
        if (configKeys.isNullOrEmpty()) {
            return false
        }
        // 遍历非必要参数列表中的每个key,检查其value是否不为空
        configKeys.takeIf { it.isNotEmpty() }?.forEach {
            if (headers[it]?.isNotBlank() == true) {
                return true
            }
        }
        return false
    }


简化后

	/**
     * 请求头是否有非必要参数 - 配置
     * return true: 有非必要参数
     */
 	private fun forbiddenHeaders(headers: Map<String, String>?, configKeys: List<String>?): Boolean {
        if (headers.isNullOrEmpty()) {
            return true
        }
        if (configKeys.isNullOrEmpty()) {
            return false
        }
        //any 非必要参数列表有一个满足条件(不为空) 则返回true
        return configKeys.any {
            headers[it]?.isNotBlank() == true
        }
    }

知识点

  • 高阶函数any。 函数会遍历集合中的每个元素,并根据给定的条件判断是否存在满足该条件的元素。如果集合中至少有一个元素满足条件,则返回 true,否则返回 false。
  • 在使用时,根据具体的需求来选择使用 any 还是 all。如果只需要判断集合中是否存在满足条件的元素,使用 any;如果需要判断集合中的所有元素是否都满足条件,使用 all。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值