Как сделать код простым в котлине? - PullRequest
0 голосов
/ 29 июня 2018

В коде A много повторяющегося кода, я надеюсь сделать это просто, но код B не работает, как я могу это исправить? Спасибо!

Код A

aMDetail?.findByDeviceDef<BluetoothDef>()?.setDevice(mContext)
aMDetail?.findByDeviceDef<WiFiDef>()?.setDevice(mContext)
aMDetail?.findByDeviceDef<ScreenDef>()?.setDevice(mContext)

Код B

with(aMDetail?){
    findByDeviceDef<BluetoothDef>()?.setDevice(mContext)
    findByDeviceDef<WiFiDef>()?.setDevice(mContext)
    findByDeviceDef<ScreenDef>()?.setDevice(mContext)
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы можете использовать apply. Это будет нулевая проверка aMDetail, а затем выполнение блока кода в контексте aMDetail.

aMDetail?.apply {
    findByDeviceDef<BluetoothDef>()?.setDevice(mContext)
    findByDeviceDef<WiFiDef>()?.setDevice(mContext)
    findByDeviceDef<ScreenDef>()?.setDevice(mContext)
}
0 голосов
/ 29 июня 2018

Редактировать

Как ответил @ veritas1 и прокомментировал @EpicPandaForce, может быть несколько подходов, которые могут удовлетворить ваши потребности, но у каждого из них есть некоторые различия в том, как они передают аргумент в блок и каковы возвращаемые значения, я пишу некоторый код для обозначения различий:

class Test {
    fun a() {}

    fun b() {}

    fun c() {}
}

fun main(args: Array<String>) {
    val test: Test? = Test()

    test?.apply {
        // `apply` passes the receiver as `this`
        a()
        b()
        c()
    }?.a() // works, because `apply` returns `this`

    test?.also {
        // `also` passes the receiver as `it`
        with(it) {
            a()
            b()
            c()
        }
    }?.a() // works, because `also` returns `this`

    test?.run {
        // `run` passes the receiver as `this`
        a()
        b()
        c()
    }?.a() // won't compile, because `run` returns the block's return value (Unit)

    test?.run {
        // `run` passes the receiver as `this`
        a()
        b()
        c()
        this
    }?.a() // works, because `run` returns the block returns `this`

    test?.let {
        with(it) {
            a()
            b()
            c()
        }
    }?.a() // won't compile, because `let` returns the block's return value (Unit)

    test?.let {
        with(it) {
            a()
            b()
            c()
        }
        it
    }?.a() // works, because the block returns `it`
}

Эта диаграмма дерева решений из Elye может помочь вам выбрать лучший метод:

Decision

В итоге, run наиболее подходит для вашего случая, потому что вам нужно null checks и отправить this в качестве аргумента, который может сделать ваш код проще:

test?.run {
    // `run` passes the receiver as `this`
    a()
    b()
    c()
}

Оригинальный ответ

Попробуйте с let:

aMDetail?.let {
    with(it) {
        findByDeviceDef<BluetoothDef>()?.setDevice(mContext)
        findByDeviceDef<WiFiDef>()?.setDevice(mContext)
        findByDeviceDef<ScreenDef>()?.setDevice(mContext)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...