在kotlin中重写下面的代码会有什么更优雅的方式。
if (xList.isEmpty()) {
throw SomeException("xList was empty")
}
我们有一个throwif运算符吗?
答案 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()