Есть ли в Kotlin чистый способ присвоить значение переменной, только если значение не равно нулю?
Мой пример:
if (x != null)
y = x
Я нашел решение вроде
y = x? : return
но я не понимаю, делает ли это то, что я хочу, и как работает этот оператор.
@ user8320224 проблема с этим решением заключается в том, что y, вероятно, является ненулевым полем, следовательно, проверка допустимости значения NULL перед назначением.

Оператор называется «Оператор Элвиса». Он оценивает, не является ли x нулевым, и если это правда, назначает x на y. Если он равен нулю, он оценивает оператор после вопросительного знака, немедленно возвращается и, следовательно, оставляет y нетронутым.
К сожалению, решение было «y = x?: Return», а не x = y?: Return. Это решение сработало для меня «y = x?: Return». Теперь я понимаю оператора Элвиса благодаря твоему описанию. Можете ли вы исправить свой ответ для правильного решения? ... Моя ошибка.
Это будет работать в некоторых сценариях, но при такой формулировке вопроса это не всегда будет подходящим решением. Он также возвращается из текущей функции, если x равен нулю, поэтому он делает больше, чем просто присваивает x переменной y, если x не является нулевым. Если после этой строки в функции было больше кода, этот код будет пропущен, если x был равен нулю, поскольку функция уже вернула.
Другое решение, если вы пока не хотите возвращаться из функции:
x?.let{ y = it }
Что проверяет, не является ли x ненулевым, а затем передает его в качестве единственного параметра лямбда-блоку.
Это также безопасный вызов, если ваш x - это var.
Каким будет однострочный способ присвоить X <или значение по умолчанию> Y, только если Y равно нулю или если оно равно нулю (соответственно типам X и Y String / int)?
Да, работает, но это уродливый!
Ваш код такой же, но с меньшим написанием:
if (x != null)
y = x
else
return
При использовании оператора Elvis оператор if else сокращается до:
y=x ?: return
Если левая сторона истинна (x не равно нулю), тогда будет присвоено y, иначе будет выполнена правая сторона.
Для тех, кто ищет и хочет решение, которое немедленно возвращает нет. Можно зажать нос и сделать так:
y = x ?: y
Как хороший программист, мне не терпится присвоить переменную самой себе, чтобы удовлетворить синтаксису. Но это же котлин для тебя! Эти дизайнеры продумали все!
Если вам нужно установить свойство, можно переопределить сеттер по умолчанию, например
var y: Int? = 0 set(x: Int?) { if (x != null) field = x }