如何在Kotlin中将应用程序中的重复语句分组?
这是我的代码。 正如你所看到的适用的身体是完全一样的。 有没有比使用扩展功能更好?
contentText?.let { contentTextView?.apply { visibility = View.VISIBLE text = contentText } } titleText?.let { titleTextView?.apply { visibility = View.VISIBLE text = titleText } }
这是我的功能
private fun setTextAndVisiblity(textView: TextView?, newText: String?): TextView? { return textView?.apply { visibility = View.VISIBLE text = newText } }
这是我申请函数时的代码
contentText?.let { setVisibleText(contentTextView, it) } titleText?.let { setVisibleText(titleTextView, it) }
我会写这样的扩展功能:
fun TextView.setVisibleIfTextNotNull(text: CharSequence?) = text?.let { visibility = View.VISIBLE this.text = it }
用法:
contentTextView?.setVisibleIfTextNotNull(contentText) titleTextView?.setVisibleIfTextNotNull(titleText)
您可以将其作为嵌套函数或私有扩展函数。 功能的名称可能不够清楚,以澄清功能,你可能会想到一个更好的。
扩展功能似乎是最好的选择。 如果你使这个函数返回this
你可以使用它而不用。
你的其他选择是创建一个普通的函数,并将其传递给also
使用方法引用,例如
fun setVisibleText(view: View) { } titleTextView.also(this::setVisibleText)
对我来说最干净的就是声明一个扩展函数:
fun TextView.setVisibleWithText(text: String?){ text ?: return visibility = View.VISIBLE setText(text) }
然后将其称为:
myTextView?.setVisibleWithText(myText)
无论如何,记住一个扩展函数只是一个静态的util函数。 下面是这个功能:
fun TextView.setVisibleWithText(text: String){ visibility = View.VISIBLE setText(text) }
在java中会变成这样的东西:
class TextViewKt { public static function setVisibleWithText(@NotNull TextView receiver, @NotNull String text){ receiver.visibility = View.VISIBLE receiver.setText(text) } }
然后你可以这样称呼它:
theText?.let { theTextView?.setVisibleWithText(it) }
你总是可以声明一个正常的函数为:
fun setVisibleWithText(textView: TextView, text: String){ textView.visibility = View.VISIBLE textView.text = text }
或者如果你想在里面做检查:
/*** * It makes the textview visible if text is not null (it will stay visible if it was visible before) **/ fun setVisibleWithText(textView: TextView, text: String?){ text ?: return textView.visibility = View.VISIBLE textView.text = text }