gpt4 book ai didi

kotlin - 如何为 Kotlin 实现 applyif?

转载 作者:行者123 更新时间:2023-12-02 06:17:40 25 4
gpt4 key购买 nike

我想要一个 applyif 来工作:

builder.applyif(<condition expression>) {
builder.set...
}

等于:

builder.apply {
if (<condition expression>) {
builder.set...
}
}

这可能吗?

最佳答案

是的,当然。您几乎可以对任何东西进行编程,但是不要重新发明轮子。查看答案的底部,看看没有自己的扩展函数的标准 Kotlin 方法,这可能已经满足您的需求(但不完全是 applyIf )。

现在,让我们看看如何实现 applyIf:

inline fun <T> T.applyIf(predicate: T.() -> Boolean, block: T.() -> Unit): T = apply { 
if (predicate(this))
block(this)
}

如果您使用 lambda 实现扩展函数,请不要忘记内联

这是上述内容的示例用法。

// sample class
class ADemo {
fun isTrue() = true
}

// sample usage using method references
ADemo().applyIf(ADemo::isTrue, ::println)

// or if you prefer or require it, here without
ADemo().applyIf( { isTrue() } ) {
println(this)
}

如果您只想提供 bool 值,则可以使用以下扩展函数:

inline fun <T> T.applyIf(condition : Boolean, block : T.() -> Unit) : T = apply { 
if(condition) block(this)
}

并用以下方式调用它:

val someCondition = true
ADemo().applyIf(someCondition) {
println(this)
}

现在可能会有更多人熟悉的 Kotlin 标准方式:

ADemo().takeIf(ADemo::isTrue)
?.apply(::println)

// or
ADemo().takeIf { it.isTrue() }
?.apply { println(this) }

如果他们确实记得(实际上我不记得,直到我看到 Marko Topolniks 的评论),他们应该立即知道发生了什么。但是,如果您在调用 takeIf 后需要给定值(即 ADemo()),则此方法可能不适用于您,因为以下会将变量设置为 null 然后:

val x = ADemo().takeIf { false }
?.apply { println(this) /* never called */ }
// now x = null

而以下代码会将变量设置为 ADemo-实例:

val x = ADemo().applyIf(false) { println(this) /* also not called */ }
// now x contains the ADemo()-instance

那么链接构建器调用可能不太好。不过,您也可以通过标准 Kotlin 函数来完成此操作,将 takeIfapplyalso(或 withletrun,具体取决于您是否想要返回某些内容,或者您​​更喜欢使用 itthis ):

val x = builder.apply {
takeIf { false }
?.apply(::println) // not called
takeIf { true }
?.apply(::println) // called
}
// x contains the builder

但是话又说回来,我们已经快到了你已经提出问题的地方了。使用 applyIf-usage 看起来肯定更好:

val x = builder.applyIf(false, ::println) // not called
.applyIf(true) {
println(this) // called
}
// x contains the builder

关于kotlin - 如何为 Kotlin 实现 applyif?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51606956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com