我该如何用惯用的Kotlin来写呢?
我有一些代码:我该如何用惯用的Kotlin来写呢?,kotlin,Kotlin,我有一些代码: 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
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中,有两个重复的返回条件。(这是centerX)
我试着这样做:
private fun getTouchX(): Int {
if (arguments == null || !arguments.containsKey(KEY_DOWN_X)) {
return centerX()
}
return arguments.getInt(KEY_DOWN_X)
}
然而,它看起来更像Java而不是Kotlin
我怎样才能用惯用的Kotlin来写这个呢?我可能会使用带有
的表达式函数,当表达式:
private fun getTouchX() = when {
arguments == null || !arguments.containsKey(KEY_DOWN_X) -> centerX()
else -> arguments.getInt(KEY_DOWN_X)
}
您也可以考虑声明<代码> Touxx < /C> >作为<代码>私有Vala/Calp>:
private val touchX: Int
get() = when {
arguments == null || !arguments.containsKey(KEY_DOWN_X) -> centerX()
else -> arguments.getInt(KEY_DOWN_X)
}
我不确定争论来自何方,但一个更干净的解决方案是
private fun getTouchX(): Int =
if(arguments?.containsKey(KEY_DOWN_X) == true) {
arguments.getInt(KEY_DOWN_X)
} else {
centerX()
}
if
仅调用containsKey
if参数
为非null,否则==
的左侧解析为null
<代码>空!=true
,因此它将从else返回centerX()
类似地,如果参数为非null,则将使用containsKey
的结果来解析
现在只有一个表达式,可以使用body表达式格式 看看普通的Kotlin代码,我的建议是:
private fun getTouchX() =
arguments?.let {
if (!it.containsKey(KEY_DOWN_X))
return@let null
it.getInt(KEY_DOWN_X)
} ?: centerX()
但如果参数
是安卓基本捆绑包
的后代,您可以进一步将其压缩为:
private fun getTouchX() = arguments?.getInt(KEY_DOWN_X, centerX()) ?: centerX()
注:由于方法签名可疑地看起来像读取属性,您可以考虑将其转换成只读属性。 <代码>,<代码>语法被禁止,最好使用<代码> < <代码>。而且,null
-检查的方式是java风格的祸根;)说得好,它短路了一条线。然而,arguments==null
这在我看来很长。(个人感受)。谢谢你@leoderprofi:你在哪里读到逗号作为不推荐使用的模式分隔符?在Kotlin参考资料中找不到任何关于它的提及。至于空值检查的方式,Kotlin不是Java,只要空值检查正确传播,它是完全安全的,而且我认为它比使用==true进行空值检查更清晰。Android Studio在没有参数的情况下发出警告。我花了一段时间通过网络找到这个。我从不喜欢java中所有的空检查,b==true
forb:Boolean?
表达式(在最底层)@leoderprofi:Hmm,看起来你是对的。当{…}
时,不建议使用逗号作为模式分隔符(但当(…){…}
时,不建议使用逗号作为模式分隔符)。奇怪的是,参考文献中没有提到它。请告诉我们什么是论点,帮助我们解决这个问题。这不是一个简单的映射,因为我不熟悉getInt,所以它是什么数据结构呢?@Mikezx6r谢谢你的提问。参数是在Android片段中使用的Bundle对象。我对这个问题的答案有所改变。因为getInt不返回null。因此,使用containsKey是必要的。谢谢@Mikezx6r