例子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。