Котлин пишет функцию, которая проверяет потенциально десятки значений и возвращает их ненулевые значения с лямбда-типом - PullRequest
2 голосов
/ 02 октября 2019

Итак, вот что я хочу сделать: у меня есть этот набор значений Nullable:

 val orderDemand: String? = cell.orderDemand
 val orderNumber: Int? = cell.orderNumber
 val orderConceal: Boolean? = cell.orderConceal
 val scriptCode: String? = cell.scriptCode
 val scriptTimestamp: Long? = cell.scriptTimestamp

Дело в том, что иногда они бывают нулевыми, поэтому я не могу просто инициализировать значения как Non-null.

Я хочу создать функцию или класс, который может работать с потенциальными десятками значений и должен выглядеть следующим образом:

 executeIfNotNull(
          cell.orderDemand,
          cell.articleImageURL,
          cell.articleTitle,
          cell.scriptCode,
          cell.scriptTimestamp){ orderDemand, orderNumber, orderConceal, scriptCode,
               scriptTimestamp ->
                   doSomethingWithAllTheseNonNullValues(...)
               }

Я не смог найти никакого рабочего решения наИнтернет для фактических множественных значений, но явные решения для 2 или максимум 3 значений. Я действительно сталкивался с этим решением для 6 значений:

private fun <A,B,C,D,E,F,T> nonNullMultipleCheck(
    a:A, b:B, c:C, d:D, e:E, f:F, execute: (A, B, C, D, E, F) -> T) {
   if(a!=null && b!=null && c!=null && d!=null && e!=null && f!=null) run {
       execute(a, b, c, d, e, f)
   }
}

Извините, но это может сделать только шутка программиста. Я ищу решение, в котором я могу использовать Array или Set или Vararg, где я могу дать все обнуляемые значения в качестве параметров и получить доступ к лямбда-типу результата по имени ({ orderDemand, orderNumber, orderConceal, scriptCode, scriptTimestamp ->), как я описал в функциональной модели выше. Как я могу заставить это работать с таким количеством значений, как я хочу? Заранее спасибо!

1 Ответ

2 голосов
/ 02 октября 2019

Послушайте, если честно, я не думаю, что такой метод решит вашу проблему. Потому что, если два аргумента относятся к одному и тому же типу, как вы узнаете, какой аргумент имеет значение null, а какой не должен выполнять ваш doSomethingWithAllTheseNonNullValues() метод?

Тем не менее, вот рабочий пример.

fun <T> executeWithoutNulls(vararg args: Any?, execute: (Array<Any>) -> T) {
    val filterArguments = args.toList().mapIndexed { index, any ->
        if (any != null) any
        else null
    }.filterNotNull()

    execute(filterArguments.toTypedArray())
}

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

Пример:

fun example() {
    val orderDemand: String? = "orderDemand"
    val orderNumber: Int? = null
    val orderConceal: Boolean? = true
    val scriptCode: String? = null
    val scriptTimestamp: Long? = 100L

    executeWithoutNulls(orderDemand, orderNumber, orderConceal, scriptCode, scriptTimestamp) {
        it.forEach {
            println("Example - value: ${it}")
        }
    }
}

Вывод

Example - value: orderDemand
Example - value: true
Example - value: 100

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

fun <T> executeWithoutNullsIndexed(vararg args: Any?, execute: (Array<Pair<Int, Any>>) -> T) {
    val filterArguments = args.toList().mapIndexed { index, any ->
        if (any != null) Pair(index, any)
        else null
    }.filterNotNull()

    execute(filterArguments.toTypedArray())
}

Пример

fun example() {
    val orderDemand: String? = "orderDemand"
    val orderNumber: Int? = null
    val orderConceal: Boolean? = true
    val scriptCode: String? = null
    val scriptTimestamp: Long? = 100L

    executeWithoutNullsIndexed(orderDemand, orderNumber, orderConceal, scriptCode, scriptTimestamp) {
        it.forEach {
            println("Example - Index: ${it.first} with value: ${it.second}")
        }
    }
}

Выход

Example - Index: 0 with value: orderDemand
Example - Index: 2 with value: true
Example - Index: 4 with value: 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...