如果不为 null,则将值设置为构建器 - Kotlin

eve*_*ian 2 kotlin kotlin-null-safety

我是科特林新手。有人可以告诉我如何在下面的 cade 中仅当不为空时才设置该值。应该有一种方法可以使用 withlet()但我不知道该怎么做。

如果var2不为空,只有我应该设置它。否则会抛出空指针错误。

private fun myFunc(var1: Type1 , var2: Type2?) {
    
        val request = class1.newBuilder()
            .setType1(var1)
            .setType2(var2) // how to set var2 only if not null? 
            .build()
        clientClass.send(request)
 }
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 5

如果每个构建器函数返回一个新的构建器实例,请使用run

\n
private fun myFunc(var1: Type1 , var2: Type2?) {\n    val request = class1.newBuilder()\n        .setType1(var1)\n        .run { if(var2 != null) setType2(var2) else this }\n        .build()\n    clientClass.send(request)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果构建器函数发生变化并返回相同的构建器实例,则\xe2\x80\x99s更易于使用apply

\n
private fun myFunc(var1: Type1 , var2: Type2?) {\n    val request = class1.newBuilder()\n        .setType1(var1)\n        .apply { if(var2 != null) setType2(var2) }\n        .build()\n    clientClass.send(request)\n}\n\n// or more cleanly using apply for everything instead of chaining:\n\nprivate fun myFunc(var1: Type1 , var2: Type2?) {\n    val request = class1.newBuilder().apply {\n        setType1(var1)\n        if(var2 != null) setType2(var2)\n        build()\n    }\n    clientClass.send(request)\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

其函数返回新实例的 Builder 类示例:

\n
fun setType2(type2: Type2): Builder {\n    return CombinedBuilder(this, type2) // a new object\n}\n
Run Code Online (Sandbox Code Playgroud)\n

其函数返回相同实例的 Builder 类示例:

\n
fun setType2(type2: Type2): Builder {\n    this.type2 = type2\n    return this // the same object\n}\n
Run Code Online (Sandbox Code Playgroud)\n

第二种比较常见,但有时也使用第一种。您可能需要检查源代码才能确定。如果您不能确定,请使用该.run方法,因为它对任何一个都有效。

\n

  • 如果函数正在改变同一个构建器,我认为将全部内容包装在“apply”中可能会更干净 - 然后你会得到熟悉的“执行此操作,如果 X 则执行此操作”流程,而不必链接事物 (2认同)