Kotlin中的throw if操作符

w51jfk4q  于 2023-05-01  发布在  Kotlin
关注(0)|答案(6)|浏览(142)

用Kotlin重写下面的代码有什么更优雅的方法?

if (xList.isEmpty()) {
   throw SomeException("xList was empty")
}

我们有投掷操作员什么的吗?

nwnhqdif

nwnhqdif1#

我喜欢使用takeIf标准函数来验证,加上elvis运算符,它给出了:

xList.takeIf { it.isNotEmpty() } ?: throw SomeException("xList was empty")

我必须补充的是,在大多数情况下,我需要的是IllegalArgumentException,只使用require更简单。
如果我们需要IllegalStateException,我们可以使用check
参见:checkNotNullrequireNotNullerror

ffdz8vbo

ffdz8vbo2#

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

xList.isNotEmpty() || throw SomeException("xList was empty")

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

6ju8rftf

6ju8rftf3#

在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" }

或者简单地使用require(Boolean, () -> Any)

require(!xList.isEmpty()) { "xList was empty" }
r7knjye2

r7knjye24#

我不知道标准库中的函数,但你可以自己轻松地做到这一点:

/**
 * Generic function, evaluates [thr] and throws the exception returned by it only if [condition] is true
 */
inline fun throwIf(condition: Boolean, thr: () -> Throwable) {
    if(condition) {
        throw thr()
    }
}

/**
 * Throws [IllegalArgumentException] if this list is empty, otherwise returns this list.
 */
fun <T> List<T>.requireNotEmpty(message: String = "List was empty"): List<T> {
    throwIf(this.isEmpty()) { IllegalArgumentException(message) }
    return this
}

// Usage
fun main(args: Array<String>) {
    val list: List<Int> = TODO()
    list.filter { it > 3 }
        .requireNotEmpty()
        .forEach(::println)
}
odopli94

odopli945#

原始代码紧凑、透明、灵活。具有固定异常的扩展fun可能更紧凑。

infix fun String.throwIf(b: Boolean) {
    if (b) throw SomeException(this)
}

"xList was empty" throwIf xList.isEmpty()
pjngdqdw

pjngdqdw6#

这个问题是旧的,当前的解决方案是使用ifEmpty

return xList.ifEmpty { throw SomeException("xList was empty") }

相关问题