【问题标题】:Kotlin: how to put two statements "apply" and "let" together in a nice way?Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?
【发布时间】:2021-12-13 08:30:21
【问题描述】:

为了简单起见,我将坚持代码中的抽象。 因此,我正在编写一个函数,该函数仅在不为空时才采用一些可为空的颜色来设置它。我正在使用 Builder,代码如下所示:

private fun buildIcon(color: Color? = null) =
    Icon.Builder()
        .apply{ color?.let { this.setColor(color) } }

它可以工作,但看起来有点难看,我如何将它变成一个语句,所以类似于 applyIfNotNull(color) { this.setColor(it) },但可能更简单,我只是想将这些语句合并为一个.我尝试像在how to implement an applyif for Kotlin? 中那样执行此操作,但无法使其工作。

【问题讨论】:

  • 值得检查将颜色设置为null 是否有任何危害。 (例如,它可能会告诉图标从其容器继承颜色。) 如果没有,那么您可以省略检查并总是调用setColor()。
  • 它实际上是从资源创建图标,如果没有提供 setColor,你会得到默认颜色——这就是我们不向 buildIcon() 提供颜色时应该发生的情况。 setColor 函数也接受不可为空的参数,所以不是这样

标签: kotlin apply nullable builder let


【解决方案1】:

你可以像这样实现你的applyIfNotNull函数:

inline fun <T, U> T.applyIfNotNull(value: U?, block: T.(U) -> Unit): T {
    if(value != null)
        this.block(value)
    return this
}

用法:

private fun buildIcon(color: Color? = null) =
    Icon.Builder().applyIfNotNull(color) { this.setColor(it) }

您可以验证它here。

【讨论】:

  • 这就是我想要的。我唯一要改变的是应用 = {} 而不是返回它,但它看起来不错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2015-03-04
  • 2017-12-09
相关资源
最近更新 更多