#7. определяем пользовательскую joinToString

Приветствую читатель!

Здесь оставлю пример реализации пользовательской функции joinToString на Kotlin, написанную с использованием хвостовой рекурсии. Не претендую на лучшую реализацию, но как пример имеет место быть.

Kotlin
fun main() {

    listOf("a", "r", "a", "z", "u", "m")
        .joinToStringCustom(delimiter = '_', convert = String::uppercase)
        .run(::println)
    // вернет A_R_A_Z_U_M
}

/**
 * Функция собирает элементы коллекции в строку
 * @param [delimiter] - разделитель
 * @param [convert] - функция применится для каждого элемента
 * @return - Результирующая строка
 */
fun <T> List<T>.joinToStringCustom(delimiter: Char = ',', convert: (T) -> T): String {
    tailrec fun _joinToString(acc: String, list: List<T>): String {
        return when {
            list.isEmpty() -> acc.trim(delimiter)
            else -> {
                _joinToString("$acc${list.first()}$delimiter", list.drop(1))
            }
        }
    }
    return _joinToString("", map { convert(it) })
}