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