我有一个包含许多字段的对象。例如:
房屋
-Windows
-门
-管道
等
我正在寻找一种优雅的方法来检查元素之一是否不为null。
而不是-if (windows != null || doors != null || pipes...)
答案 0 :(得分:5)
假设您不想使用反射,则可以构建一个List
并在其上使用any
:
val anyElementNull = listOf(window, doors, pipes).any { it != null }
答案 1 :(得分:4)
您可以使用listOfNotNull
,例如
val allNonNullValues = listOfNotNull(windows, doors, pipes)
if (allNonNullValues.isNotEmpty()) { // or .isEmpty() depending on what you require
// or instead just iterate over them, e.g.
allNonNullValues.forEach(::println)
if (listOf(windows, doors, pipes).any { it != null }) {
if (!listOf(windows, doors, pipes).all { it == null }) {
if (!listOf(windows, doors, pipes).none { it != null }) {
对于您当前的状况,any
变量可能是最好的。如果您想确保所有条目或所有条目都不符合特定条件,例如all
和none
,则获胜。 all { it != null }
或none { it == null }
。
或者如果以上都不适合您,请提供您自己的功能,例如:
fun <T> anyNotNull(vararg elements : T) = elements.any { it != null }
并按如下方式调用它:
if (anyNotNull(windows, doors, pipes)) {
答案 2 :(得分:2)
您可以连锁使用elvis运算符,该运算符充当if(x != null) x else y
的简写:
if( null != windows ?: doors ?: pipes )
这将遍历每个字段并返回第一个非空字段,如果链中的最后一个元素为空,则返回null
。
您应该尝试避免分配整个列表/数组,以便进行这样的简单比较。
答案 3 :(得分:0)
您可以使用filterNotNull。
fun main(args: Array<String>) {
var myObj = MyObj()
myObj.house = "house"
myObj.windows = "windows"
print(listOf(myObj.house, myObj.windows, myObj.doors).filterNotNull());
// prints: [house, windows]
}
class MyObj {
var house: String? = null
var windows: String? = null
var doors: Int? = null
}
答案 4 :(得分:-1)
val houseArray =!listOf(“ window”,“ doors”,“ pipes”)。isNullOrEmpty()