Возврат из функции в Kotlin как однострочный, когда объект равен нулю

У меня есть Java-метод, который выглядит так:

void doStuff() { MyObject myObject = myObjectRepository.findById(myObjectId); if (myObject == null) { log.warn("myObject not found, aborting"); return; } // More stuff } 

Есть ли способ сделать это одним лайнером в Котлине? Я думаю что-то вроде этого (что не работает):

 fun doStuff() { // I'd like to do something here that returns from the doStuff function when myObject is null val myObject = myObjectRepository.findById(myObjectId) ?: {log.warn("myObject not found, aborting") return} // More stuff } 

Можете ли вы сделать что-то вроде этого Котлина?

 fun doStuff() { val myObject = myObjectRepository.findById(myObjectId) ?: log.warn("myObject not found, aborting").also{ return } // More stuff } 

Но я бы согласился с DPM, классический вариант if-else – лучший вариант.

Вы можете также рассмотреть конструкцию when (в зависимости от размера, задачи функции и типа возврата):

 fun doStuff() { val myObject = myObjectRepository.findById(myObjectId) return when { myObject == null -> log.warn("myObject not found, aborting") // Unit? else -> // More stuff } } 

Одна из причин, по которой вы можете предпочесть, when над if-else также связано с тем, что я обнаружил, что он лучше использует пространство (читаемое if-else использует по крайней мере 4, иногда 5, loc), и это более разборчиво, потому что у вас есть ключевое слово, when на том же уровне возврата (или присваивания или что-то еще), и каждый случай чист и прост без каких-либо дополнительных ключевых слов, просто нелиберальный знак -> котором четко указано условие из кода.

Тем не менее, also функция расширения, предлагаемая стандартным lib kotlin. Это одна из особенностей, которые я люблю больше всего в Котлине, которая дает вам много силы и выразительности.

Позвольте мне предложить вам эту ссылку для дальнейшего изучения и изучения других полезных функций, таких как run , let , apply , takeUnless и takeIf

  val myObject = myObjectRepository.findById(myObjectId)?:run { log.warn("myObject not found, borting"); return } //more stuff 
Intereting Posts
Как включить обработчик, обработанный обработчиком аннотации, для проверки класса пути в Java / Kotlin Kotlin: 'val' по второму параметру конструктора не допускается Как вставлять для циклов в шаблоны строк Kotlin Ожидается ли, что я могу вызвать функцию с объектом-приемником, передав объект-приемник в качестве первого аргумента? Почему я не могу указать, где я хочу, чтобы мой файл Kotlin был удален в Android Studio? Как использовать @Parcelize в Kotlin 1.1.60? Android: запустите 4 async-задачи (которые работают с Rest API), подождите и начните еще одно действие после выполнения всех задач Как проверить, отсортирован ли массив строк в алфавитном порядке или нет с помощью Kotlin? Делегирование методов производных классов с помощью динамической отправки null в listOf (), а не null в listOf (значение) в Kotlin в одном лайнере? Как я могу игнорировать все предупреждения для Kotlin в IntelliJ IDEA? Слушатель внутри производителя elvis в kotlin .. foo.bar?.let(return true) ?: return false Создать конкретный Java-класс, который использует рекурсивные дженерики в Котлине Замена SAM-конструктора на лямбда ковариантным типом