如何在变量上运行链而不是 if else?

How to function chain instead of if else on a variable?

你好我想知道是否有更好的方法来使用作用域函数而不是 if else 来编写这行代码。我想根据我的 addToStack 变量

链接 .addTOBackStack() 函数
if(addToStack){
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container, feedViewFragment)
            .addToBackStack(null)
            .commit()
}else{
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container, feedViewFragment)
            .commit()
}

除非您的 addToBackStack 有某种检查机制(它有效地将您的 if else loop 逻辑转移到您的 addToBackStack 代码中,否则您无法真正逃脱 if else 循环15=]

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

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()

您可以使用 let() 范围函数链接它:

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

它有点笨拙(由于需要 return it 不做任何其他处理),但它适合任何链。

如果 addToBackStack() 只是 return 调用它的对象(即它是一个 ‘fluent’ interface), then it could be a little simpler with also():

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

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