如何在变量上使用函数链而不是if-else



嗨,我想知道是否有更好的方法可以使用作用域函数而不是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()
}

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

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

它有点麻烦(因为在不进行任何其他处理时需要返回it(,但它适用于任何链。

如果addToBackStack()只是返回它调用的对象(即它是一个"流畅"的接口(,那么使用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()

相关内容

  • 没有找到相关文章

最新更新