我该如何用惯用的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
for
b:Boolean?
表达式(在最底层)@leoderprofi:Hmm,看起来你是对的。当{…}
时,不建议使用逗号作为模式分隔符(但当(…){…}
时,不建议使用逗号作为模式分隔符)。奇怪的是,参考文献中没有提到它。请告诉我们什么是论点,帮助我们解决这个问题。这不是一个简单的映射,因为我不熟悉getInt,所以它是什么数据结构呢?@Mikezx6r谢谢你的提问。参数是在Android片段中使用的Bundle对象。我对这个问题的答案有所改变。因为getInt不返回null。因此,使用containsKey是必要的。谢谢@Mikezx6r