Я написал следующий код:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
for (i in src)
{
if (i % 2 == 0) dest.add(Math.sqrt(i.toDouble()))
}
IntellJ (в моем случае AndroidStudio) спрашивает меня, хочу ли я заменить цикл for на операции из stdlib. Это приводит к следующему коду:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
src.filter { it % 2 == 0 }
.mapTo(dest) { Math.sqrt(it.toDouble()) }
Теперь я должен сказать, мне нравится измененный код. Мне легче писать, чем для циклов, когда я сталкиваюсь с подобными ситуациями. Однако, прочитав, что делает функция filter
, я понял, что это намного более медленный код по сравнению с циклом for. Функция filter
создает новый список, содержащий только элементы из src, которые соответствуют предикату. Таким образом, есть еще один список и еще один цикл в stdlib-версии кода. Ofc для небольших списков это может быть не важно, но в целом это не похоже на хорошую альтернативу. Особенно, если нужно объединить больше таких методов, вы можете получить много дополнительных циклов, которых можно было бы избежать, написав цикл for.
Мой вопрос - это то, что считается хорошей практикой в Котлине. Должен ли я придерживаться циклов или я что-то упускаю, и это не работает, поскольку я думаю, что это работает.