我有如下方法:
fun <T1, T2, T3> ifCoordsNotNull(v1: T1?, v2: T2?, v3: T3?, allNotNull: (T1, T2, T3) -> (Unit)) {
if (v1 != null && v2 != null && v3 != null) {
allNotNull(v1, v2, v3)
}
}
我知道这是一种检查多个值是否为null的方法;但是,除非我制定几种相关方法,否则它似乎并不能满足我的需求。
有没有一种方法可以将需要检查null的所有/所有变量放入列表/集中,然后使用单个方法在回调中恢复结果(如果有)?
更具体地说,我可以使用如下所示的当前方法:
ifCoordsNotNull(loc["x"], loc["y"], loc["z"]) { x, y, z ->
但如果可能的话,宁愿创建一种更符合人体工程学的方法,该方法可以在许多情况下工作:
ifNotNull(linkedSetOf(loc["x"], loc["y"], loc["z"])) { x, y, z ->
如果有类似的事情,或者我需要更好的做法,请告诉我。谢谢。
答案 0 :(得分:-1)
您可以使用vararg
关键字和filterNotNull
,例如:
fun ifNotNull(vararg input: Any?, function: (s: List<Any>) -> Unit) {
val list = input.filterNotNull().toList()
if (list.size != input.size) {
throw RuntimeException()
}
function(list)
}
结果将是:
ifNotNull(1, 2, 3) {
println(it)
} // [1, 2, 3]
ifNotNull("a", 1, null) {
println(it)
} // Throws
答案 1 :(得分:-1)
您需要正确执行的操作是具有可变数量的类型参数的泛型,而Kotlin没有。实际上,我所知道的唯一具有这种功能的语言是C++。
否则,您将:
丢失类型和/或参数数量,如Alexey Soshin的答案
必须为不同数量的参数引入类,与为每种数量的参数声明方法相比,最终要做的工作更多。
答案 2 :(得分:-1)
以下可能是一些变体:
fun check(vars: Array<Any?>): Boolean = vars.filterNotNull().size == vars.size
fun <T1, T2, T3> ifCoordsNotNull(v1: T1?, v2: T2?, v3: T3?, allNotNull: (T1, T2, T3) -> (Unit)) {
if (check(arrayOf(v1, v2, v3))) {
allNotNull(v1!!, v2!!, v3!!)
}
}
您也许可以使用合同(https://kotlinlang.org/docs/reference/whatsnew13.html#contracts)摆脱!!