Тип приведен для каждого цикла - PullRequest
0 голосов
/ 30 октября 2019

Я выполняю рефакторинг некоторого кода, и в качестве промежуточного шага я хочу перебрать список X и набрать приведение каждого элемента к Y. Работает следующее:

val xs: List<X>
for (x in xs) {
    val y = x as Y
}

Но я хотел бы знать, как объединить итерацию и приведение типов так, чтобы 1) мне не нужно было вводить переменные x и 2) я мог бы комбинироватьдве строки в одну строку.

Я пробовал следующее

val xs: List<X>
for ((y as Y) in xs) {
}

val xs: List<X>
for ((y in xs) as Y) {
}

, но безуспешно. Можно ли даже объединить приведение типов и итерацию? Как?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Возможно, вы захотите сделать что-то вроде этого:

xs.map {it as Y}.forEach { 
            //do your stuff
        }

Я бы сказал, что это довольно хороший синтаксис, без необходимости каких-либо дополнительных переменных

0 голосов
/ 30 октября 2019

Вы можете извлечь forEach с приведением к функции более высокого порядка:

inline fun <reified T> forEachCasted(iterable: Iterable<*>, action: (T) -> Unit) =
    iterable.forEach { action(it as T) }

И использовать это так:

forEachCasted<Y>(xs) { ... }

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

inline fun <reified T> Iterable<*>.forEachCasted(action: (T) -> Unit) =
    forEach { action(it as T) }

И использовать это так:

xs.forEachCasted<Y> { ... }
...