如何在变量上使用链而不是 if else ?

问题描述

嗨,我想知道是否有更好的方法来使用作用域函数而不是 if else 来编写这行代码。我想根据我的 .addTOBackStack() 变量链接 addToStack 函数

if(addToStack){
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container,FeedViewFragment)
            .addToBackStack(null)
            .commit()
}else{
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container,FeedViewFragment)
            .commit()
}

解决方法

您可以使用 let() 范围函数将其链接起来:

supportFragmentManager
    .beginTransaction()
    .replace(R.id.fragment_container,feedViewFragment)
    .let{ if (addToStack) it.addToBackStack(null) else it }
    .commit()

这有点繁琐(因为在不进行任何其他处理时需要返回 it),但它适合任何链。

如果 addToBackStack() 只是返回调用它的对象(即它是一个 ‘fluent’ 接口),那么使用 also() 可能会更简单一些:

supportFragmentManager
    .beginTransaction()
    .replace(R.id.fragment_container,feedViewFragment)
    .also{ if (addToStack) it.addToBackStack(null) }
    .commit()

当然,如果处理变得庞大而复杂,这可能会使代码变得非常难以阅读 - 因此也值得考虑使用临时变量来拆分链(根据另一个答案)。

,

除非您的 addToBackStack 具有某种检查机制(可以有效地将您的 if else loop 逻辑移动到您的 addToBackStack 代码中),否则您无法真正摆脱这里的 if else 循环

如果您想要更短、更易读的代码,这是一种方法:

sfm = supportFragmentManager
    .beginTransaction()
    .replace(R.id.fragment_container,feedViewFragment)
sfm = addToStack ? sfm.addToBackStack(null) : sfm
sfm.commit()

或使用三元到其最大值:

sfm = supportFragmentManager
    .beginTransaction()
    .replace(R.id.fragment_container,feedViewFragment)

addToStack ? sfm.addToBackStack(null).commit() : sfm.commit()