如果运营商在Kotlin投掷

时间:2017-11-10 12:39:04

标签: kotlin

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

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

我们有一个throwif运算符吗?

5 个答案:

答案 0 :(得分: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" }

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

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

答案 1 :(得分:6)

我喜欢使用takeIf标准功能进行验证,添加elvis operator后,它会给出:

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

答案 2 :(得分:3)

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

unary

之所以有效,是因为 xList.isNotEmpty() || throw SomeException("xList was empty") 是一个表达式,其类型为 throw,它是所有内容的子类型,包括 Nothing

答案 3 :(得分:1)

我不知道标准库中的函数,但您可以自己轻松完成:

/**
 * 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)
}

答案 4 :(得分:1)

原始代码紧凑,透明且灵活。 具有固定异常的乐趣可能更紧凑。

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

"xList was empty" throwIf xList.isEmpty()