/**
* 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)
}
6条答案
按热度按时间nwnhqdif1#
我喜欢使用
takeIf
标准函数来验证,加上elvis运算符,它给出了:我必须补充的是,在大多数情况下,我需要的是
IllegalArgumentException
,只使用require
更简单。如果我们需要
IllegalStateException
,我们可以使用check
。参见:checkNotNull、requireNotNull、error
ffdz8vbo2#
还有一个建议,简洁且不需要额外的代码:
它之所以有效,是因为
throw
是一个表达式,其类型为Nothing
,它是所有内容的子类型,包括Boolean
。6ju8rftf3#
在Kotlin库中,有一些函数在输入无效时抛出异常,例如:例如
requireNotNull(T?, () -> Any)
。如果需要的话,可以参考这些函数并编写一个类似的函数来处理空列表。或者简单地使用
require(Boolean, () -> Any)
:r7knjye24#
我不知道标准库中的函数,但你可以自己轻松地做到这一点:
odopli945#
原始代码紧凑、透明、灵活。具有固定异常的扩展
fun
可能更紧凑。pjngdqdw6#
这个问题是旧的,当前的解决方案是使用
ifEmpty
: