如何在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 }