Итак, я пытаюсь сократить этот код и избежать подсказки smart cast из IDE. Идея состоит в том, что у меня есть переменная nullable типа T, и я хочу либо сопоставить ее с R, либо просто получить R от поставщика на случай, если переменная { {X4}}.

Я пробовал разные подходы и придумал этот. Тем не менее, это дает мне подсказку об умном актерском составе.

fun <T, R> T?.func(mapper: (T) -> R, supplier: () -> R): R =
    when(this) {
        null -> supplier()
        else -> mapper(this) // smart cast
    }

Но мне не нравится необходимость заключать одну из лямбд в скобки. Например.

fun foo(value: String?): Int =
    value.func({ it.length + 20}) { 30 }

Это может показаться странным, но идея в моем контексте заключалась в том, чтобы передать переменную как не nullable в функцию, которая создала R, или вызвать функцию, которая сгенерировала R.

fun bar(value: T?): R =
    when(value) {
        null -> func1()
        else -> func2(value) // smart cast
    }

Примечание. Я прочитал это, но это не то же самое.

0
chriptus13 15 Июн 2020 в 05:03

1 ответ

Лучший ответ

Следующее должно избегать подсказки умного приведения

fun <T, R> T?.func(mapper: (T) -> R, supplier: () -> R): R {
    return this?.let { mapper(it) } ?: supplier()
}
1
sidgate 15 Июн 2020 в 10:44