我有一个如下代码。
private fun getTouchX(): Int {
arguments ?: return centerX()
return if (arguments.containsKey(KEY_DOWN_X)) {
arguments.getInt(KEY_DOWN_X)
} else {
centerX()
}
}
private fun centerX() = (views.rootView?.width ?: 0) / 2
我想缩短这一行。
在函数getTouchX中 有2个返回条件重复。 (这是centerX)
我试着像下面这样做
private fun getTouchX(): Int {
if (arguments == null || !arguments.containsKey(KEY_DOWN_X)) {
return centerX()
}
return arguments.getInt(KEY_DOWN_X)
}
然而,它看起来像JAVA风格。
所以我想把这种风格改成Kotlin风格。
任何人都有一些想法?
答案 0 :(得分:4)
我不确定论据的来源,但更清晰的解决方案是
private fun getTouchX(): Int =
if(arguments?.containsKey(KEY_DOWN_X) == true) {
arguments.getInt(KEY_DOWN_X)
} else {
centerX()
}
如果if
非空,containsKey
只会调用arguments
,否则==
的左侧会解析为null
。 null != true
,因此会从其他地方返回centerX()
。
同样,如果参数为非null,则containsKey
的结果将用于解析。
现在只有一个表达式,可以使用正文表达格式。
答案 1 :(得分:3)
我可能会使用带有when
表达式的表达式函数:
private fun getTouchX() = when {
arguments == null || !arguments.containsKey(KEY_DOWN_X) -> centerX()
else -> arguments.getInt(KEY_DOWN_X)
}
您还可以考虑将touchX
声明为private val
:
private val touchX: Int
get() = when {
arguments == null || !arguments.containsKey(KEY_DOWN_X) -> centerX()
else -> arguments.getInt(KEY_DOWN_X)
}
答案 2 :(得分:0)
仅考虑普通的Kotlin代码,我的建议是:
private fun getTouchX() =
arguments?.let {
if (!it.containsKey(KEY_DOWN_X))
return@let null
it.getInt(KEY_DOWN_X)
} ?: centerX()
但是,如果arguments
是Android BaseBundle
的后代,则可以将其进一步压缩为:
private fun getTouchX() = arguments?.getInt(KEY_DOWN_X, centerX()) ?: centerX()
注意:由于方法签名可疑地看起来像是读取一个属性,因此您可以考虑将其变成只读属性。