当传递给varargs参数时,Kotlin能否过滤掉空参数?

当传递给varargs参数时,Kotlin能否过滤掉空参数?,kotlin,variadic-functions,Kotlin,Variadic Functions,kotlin中的此函数需要零对或多对属性 fun trackEvent(vararg properties: Pair<Any?, Any?>){ ... } 其中timeStr和user是可为空的字符串 到目前为止还不错,但这需要我们手动将所有变量分别传递给跟踪函数,而只传递一个对象会更容易。为了解决这个问题,我创建了一个函数,它接受一个Kotlin类并输出一个Pair对象数组 fun Any.toArrOfPairs(): Array<Pair<Any?, A

kotlin中的此函数需要零对或多对属性

fun trackEvent(vararg properties: Pair<Any?, Any?>){
   ...
}
其中
timeStr
user
是可为空的字符串

到目前为止还不错,但这需要我们手动将所有变量分别传递给跟踪函数,而只传递一个对象会更容易。为了解决这个问题,我创建了一个函数,它接受一个Kotlin类并输出一个
Pair
对象数组

fun Any.toArrOfPairs(): Array<Pair<Any?, Any?>>
{
  ...
}
有一个编译器错误;然而:

kotlin似乎担心
source
为空的情况。在这种情况下,是否有优雅的方法告诉它使用空数组调用
trackEvent

类似地,如果我们结合使用以下方法并调用
trackEvent
,是否有办法告诉kotlin“如果
source
为null,只需传入其他参数(在本例中为“time”对)


使助手函数接受一个可为null的接收器,并为null的情况返回一个空数组:

fun Any?.toArrOfPairs(): Array<Pair<Any?, Any?>>
{
  this ?: return emptyArray()
  // Your original code ...
}
我不确定我是否完全理解你问题的最后一部分。如果你想将显式参数和数组结合起来,你可以:

trackEvent(
    "time" to timeStr,
    *source.toArrOfPairs()
)
如果您只想在源为null时使用显式参数,可以使用Elvis运算符,但这有点难看,因为您必须将显式参数放入数组中:

trackEvent(
    *(source?.toArrOfPairs() ?: arrayOf("time" to timeStr))
)
或者只使用if语句。可能更详细,但更易于阅读:

if (source != null) {
    trackEvent(*source.toArrOfPairs())
} else {
    trackEvent(
        "time" to timeStr
    )
}

使助手函数接受一个可为null的接收器,并为null的情况返回一个空数组:

fun Any?.toArrOfPairs(): Array<Pair<Any?, Any?>>
{
  this ?: return emptyArray()
  // Your original code ...
}
我不确定我是否完全理解你问题的最后一部分。如果你想将显式参数和数组结合起来,你可以:

trackEvent(
    "time" to timeStr,
    *source.toArrOfPairs()
)
如果您只想在源为null时使用显式参数,可以使用Elvis运算符,但这有点难看,因为您必须将显式参数放入数组中:

trackEvent(
    *(source?.toArrOfPairs() ?: arrayOf("time" to timeStr))
)
或者只使用if语句。可能更详细,但更易于阅读:

if (source != null) {
    trackEvent(*source.toArrOfPairs())
} else {
    trackEvent(
        "time" to timeStr
    )
}

这很漂亮,谢谢。最后一个问题只是问如何组合您回答的两种输入。再次感谢!这很漂亮,谢谢。最后一个问题只是问如何组合您回答的两种输入。再次感谢!