检查对象中的一个字段在Kotlin中是否不为空

时间:2018-08-30 12:02:03

标签: kotlin

我有一个包含许多字段的对象。例如:

房屋
 -Windows
 -门
 -管道

我正在寻找一种优雅的方法来检查元素之一是否不为null。 而不是-if (windows != null || doors != null || pipes...)

5 个答案:

答案 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)

如果您不喜欢,也可以使用allnoneany,例如:

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变量可能是最好的。如果您想确保所有条目或所有条目都不符合特定条件,例如allnone,则获胜。 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()