Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?

Posted

技术标签:

【中文标题】Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?【英文标题】:Kotlin: how to put two statements "apply" and "let" together in a nice way? 【发布时间】: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 函数也接受不可为空的参数,所以不是这样 【参考方案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。

【讨论】:

这就是我想要的。我唯一要改变的是应用 = 而不是返回它,但它看起来不错

以上是关于Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 项目中添加两个或多个 kotlin 原生模块

C# TCP 聊天服务器:连接仅以一种方式工作

以一种有效的方式使用 ByteBuffer 将标题和数据布局打包在一个字节数组中?

如何在 django 中以一种形式组合多个模型? [复制]

Kotlin和Java EE:让二者的转换更顺畅

python SQLAlchemy多对多唯一约束仅以一种方式工作