我怎么会在惯用的Kotlin中写这个?

时间:2018-04-12 21:54:54

标签: 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 ?: 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风格。

任何人都有一些想法?

3 个答案:

答案 0 :(得分:4)

我不确定论据的来源,但更清晰的解决方案是

private fun getTouchX(): Int =
    if(arguments?.containsKey(KEY_DOWN_X) == true) {
        arguments.getInt(KEY_DOWN_X)
    } else {
        centerX()
    }

如果if非空,containsKey只会调用arguments,否则==的左侧会解析为nullnull != 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()

注意:由于方法签名可疑地看起来像是读取一个属性,因此您可以考虑将其变成只读属性。