Проверьте, не является ли одно поле в объекте пустым в kotlin - PullRequest
0 голосов
/ 30 августа 2018

У меня есть объект, который включает в себя много полей. Пример:

Дом
- окна
- двери
- трубы
и т.д.

Я ищу элегантный способ проверить, не является ли один из элементов нулевым. вместо - if (windows != null || doors != null || pipes...)

Ответы [ 4 ]

0 голосов
/ 30 августа 2018

Вы можете использовать цепочку, используя оператор elvis , который действует как сокращение для if(x != null) x else y:

if( null != windows ?: doors ?: pipes )

Это будет проходить через каждое поле и возвращать первое ненулевое значение, или null в случае, если последний элемент в цепочке равен нулю.

Вам следует избегать выделения целых списков / массивов для такого простого сравнения.

0 голосов
/ 30 августа 2018

Вы можете использовать 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)

Если вам это не нравится, вы также можете использовать all, none или any например ::

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)) {
0 голосов
/ 30 августа 2018

Если вы не хотите использовать отражение, вы можете построить List и использовать на нем any:

val anyElementNull = listOf(window, doors, pipes).any { it != null }
0 голосов
/ 30 августа 2018

Вы можете использовать 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...