Intereting Posts
Kotlin: Как получить доступ к методам get и setValue для делегата? Почему приложение не работает под Android 4.x в Котлине? Доступ к царству из неправильной нити в Espresso Как установить значение свойства по умолчанию для Kotlin для `this` Recycler Просмотр перетаскивания по различным типам просмотра Каков правильный подход, когда функция Котлина не принимает тип NULL Kotlin и новый ActivityTestRule: @Rule должен быть общедоступным Котлинский ленивый блок не выполняется при использовании Mockito и InjectMocks Можно ли смешивать Scala и Kotlin в одном модуле maven? Является ли это ошибкой Kotlin REPL? Spring boot rest api: как поддерживать как json, так и форму-urlencoded запрос? Kotlin JS и GWT interop Добавление языка на клавиатуру без открытия настроек Проверка больших файлов XML на большие XSD, есть ли быстрый способ сделать это? Kotlin coroutines использует продукты и mockito, чтобы издеваться над производственной работой

Возвращаемое значение условия if / else, но также запускает код

Я новичок в Котлине, но мне это нравится. Есть прекрасное чувство, когда вы можете превратить три строки кода в один. Теперь я часто обнаруживаю, что смотрю на свой код и думаю: «Здесь есть избыточность. Должен быть более сжатый способ сделать это». И когда я делаю некоторые поиски, часто Kotlin делает более лаконичный путь.

Вот проблема, когда я чувствую, что должно быть простое, сжатое решение Kotlin, но я не знаю об этом. Надеюсь, вы можете просветить меня!

Возьмите код, как этот надуманный пример:

fun doSomething(): Boolean { if (randomInt % 2 == 0) { foo = Foo() true } else { bar = null false } } 

Основываясь на if , я хочу запустить некоторый код, а затем вернуть значение условия. Меня просто беспокоит, что я должен явно сказать «если условие истинно, верните true . Если оно ложно, верните false ». Это кажется излишним. Конечно, я мог бы сказать return randomInt % 2 , но я хочу запустить код на основе, если это правда.

Есть ли у волшебного оператора Котлина, о котором я не знаю? Должен ли я создать функцию для обработки этой ситуации для меня, хотя синтаксис вызова, который будет отличаться от оператора if? Есть ли какая-то функция отображения или какой-то способ перегрузить if? Кажется, должен быть краткий, умный ответ, но он не подходит ко мне.

Solutions Collecting From Web of "Возвращаемое значение условия if / else, но также запускает код"

Вы можете реорганизовать свой код немного, чтобы возврат и код происходили в разных местах:

 fun doSomething(): Boolean { val isEven = randomInt % 2 == 0 if (isEven) foo = Foo() else bar = null return isEven } 

Вы можете изучить некоторые полезные функции расширения из стандартной библиотеки Kotlin. Например, вы можете использовать:

 /** * Calls the specified function [block] with `this` value as its receiver and returns `this` value. */ public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this } 

Здесь randomInt % 2 == 0 будет возвращаемым значением apply .

 fun doSomething(): Boolean = (randomInt % 2 == 0).apply { if (this) foo = Foo() else bar = null } 

Обновления: Если вы предпочитаете более читаемый код, это не очень хорошее решение. Повеселись 🙂

Я поддержал некоторые ответы. Я должен был бы рассмотреть возможность разделения условия на переменную или наличие истинного / ложного теста после условия.

Но после сна, у меня есть другое решение.

Новые функции утилиты:

 fun Boolean.onTrue(block: () -> Unit): Boolean { if (this) block() return this } fun Boolean.onFalse(block: () -> Unit): Boolean { if (!this) block() return this } 

И тогда мой исходный образец кода можно сжать до:

 fun doSomething() = (randomInt % 2).onTrue { foo() }.onFalse { bar = null } 

Это самый краткий вариант, хотя он имеет свои недостатки. Ничто не мешает пользователю, например, дважды вызвать onFalse() или вызвать onFalse() до onTrue() . Он выглядит совсем не так, как стандартный if / else, и если вы используете оба пути, как onTrue() и onFalse() должны проверить условие. И тогда, конечно, есть память использовать новую функцию полезности вместо стандартных операторов Котлина. Тем не менее, он имеет привлекательную краткость. Мне будет интересно узнать, что думают другие люди.

На самом деле это довольно просто, вам просто нужно привыкнуть к фантастическим функциям Stdlib от Kotlin, например, apply и let . В этом случае apply то, что вам нужно:

 fun idiomatic(myInt: Int) = (myInt % 2 == 0).apply { if (this) println("is equal") else println("in not equal") } 

Что происходит: apply вызывается в Any объекте, Boolean (условие) в этом случае, который непосредственно становится приемником функций, называемым this . Важно то, что это apply , когда исполняемый блок кода будет выполнен, верните его ресивер, который является вашим Boolean здесь.

Надеюсь, это то, что вам нужно!

Решение @ pixel-elephant выглядит кратким и хорошим.

Однако с точки зрения чистого кода функция doSomething() выполняет две функции.

Если возможно, вы можете разделить его на две функции и перенести проверку if на самую верхнюю функцию:

 if ( randomInt.isEven() ) { doSomethingEven() // ... } else { doSomethingOdd() // ... }