如果运营商在Kotlin投掷

S..*_*..K 3 kotlin

在kotlin中重写下面的代码会有什么更优雅的方法.

if (xList.isEmpty()) {
   throw SomeException("xList was empty")
}
Run Code Online (Sandbox Code Playgroud)

我们有一个throwif运算符吗?

crg*_*dos 16

我喜欢使用takeIf标准函数来进行验证,并加上elvis运算符,它可以实现以下功能:

xList.takeIf{ it.isNotEmpty() } ?: throw SomeException("xList was empty")
Run Code Online (Sandbox Code Playgroud)

我必须补充一点,在大多数情况下,这IllegalArgumentException是我所需要的,并且使用起来更简单require
如果我们需要一个IllegalStateException,我们宁可使用check

另请参见:checkNotNullrequireNotNull错误


bwt*_*bwt 12

还有另一个建议,简洁且不需要额外的代码:

xList.isNotEmpty() || throw SomeException("xList was empty")
Run Code Online (Sandbox Code Playgroud)

它之所以有效,是因为throw是一个表达式,其类型Nothing是所有内容的子类型,包括Boolean.


Bak*_*aii 6

在Kotlin库中,如果输入无效,则存在抛出异常的函数,例如 requireNotNull(T?, () -> Any).如果需要,您可以参考这些函数并编写类似的函数来处理空列表.

public inline fun <T> requireNotEmpty(value: List<T>?, lazyMessage: () -> Any): List<T> {
    if (value == null || value.isEmpty()) {
        val message = lazyMessage()
        throw IllegalArgumentException(message.toString())
    } else {
        return value
    }
}

//Usage:
requireNotEmpty(xList) { "xList was empty" }
Run Code Online (Sandbox Code Playgroud)

或者只是使用require(Boolean, () -> Any):

require(!xList.isEmpty()) { "xList was empty" }
Run Code Online (Sandbox Code Playgroud)