我是Kotlin 的新手.有人能告诉我,只有在下面的cade中不为null时,我才能设置值.应该有一种使用let()的方法,但我不知道如何使用.

如果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:

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

如果生成器函数发生变化并返回相同的生成器实例,则使用apply更简单

private fun myFunc(var1: Type1 , var2: Type2?) {
    val request = class1.newBuilder()
        .setType1(var1)
        .apply { if(var2 != null) setType2(var2) }
        .build()
    clientClass.send(request)
}

// or more cleanly using apply for everything instead of chaining:

private fun myFunc(var1: Type1 , var2: Type2?) {
    val request = class1.newBuilder().apply {
        setType1(var1)
        if(var2 != null) setType2(var2)
        build()
    }
    clientClass.send(request)
}

其函数返回新实例的生成器类示例:

fun setType2(type2: Type2): Builder {
    return CombinedBuilder(this, type2) // a new object
}

其函数返回相同实例的生成器类示例:

fun setType2(type2: Type2): Builder {
    this.type2 = type2
    return this // the same object
}

第二种类型更常见,但有时使用第一种类型.您可能需要判断源代码才能确定.如果您不能确定,请使用.run方法,因为这两种方法都适用.

Kotlin相关问答推荐

Kotlin 海峡没有结束

如何在Kotlin中为接受varargs的函数添加带有默认值的新参数?

在Kotlin中求n个ClosedRange实例相交的最常用方法是什么?

如何更改默认推断没有接收者的函数类型?

如果不在可组合函数中,如何获取 stringResource

通用接口继承

具有泛型类型的 Kotlin 密封接口不会为其子类型推断约束

Kotlin 具体类从抽象类和接口扩展而来,接口使用抽象类中实现的方法

为什么 Kotlin 的 null 安全性不能与局部变量初始化器一起正常工作?

parallelStream()和asSequence().asStream().parallel()之间的区别

Kotlin:查找集合中最常见的元素

如何在 kotlin @Parcelize 中使用 null

如何在调试中修复 ClassNotFoundException: kotlinx.coroutines.debug.AgentPremain?

Foo::class.java 和 Foo::javaClass 有什么区别?

如何捕获传递给模拟函数的参数并返回它?

在 Kotlin 中创建 Spinner 时,如何在 Fragment 中的旋转屏幕上修复指定为非空的参数为空?

什么是 Kotlin 等价于 Class<?>

在android java类中使用Kotlin扩展

函数引用和lambdas

java.lang.NoClassDefFoundError:解析失败:Lkotlin/time/MonoClock