Solution: Implement map

fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { val size = if (this is Collection<*>) size else 10 val result = ArrayList<R>(size) for (element in this) { result.add(transform(element)) } return result }

Example solution in playground

import org.junit.Test import kotlin.collections.onEach import kotlin.test.assertEquals // To prevent unintentional stdlib functions usage import kotlin.collections.map as `implement it yourself` import kotlin.collections.onEach as `implement it yourself` import kotlin.collections.flatMap as `implement it yourself` import kotlin.collections.filter as `implement it yourself` inline fun <T, C: Iterable<T>> C.onEach(operation: (T) -> Unit): C { for (elem in this) { operation(elem) } return this } inline fun <T, R> Iterable<T>.flatMap(transformation: (T) -> Iterable<R>): List<R> { val list = ArrayList<R>() for (elem in this) { list.addAll(transformation(elem)) } return list } inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { val list = ArrayList<T>() for (elem in this) { if (predicate(elem)) { list.add(elem) } } return list } fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { val size = if (this is Collection<*>) size else 10 val result = ArrayList<R>(size) for (element in this) { result.add(transform(element)) } return result } fun main() { val numbers = 1..10 val names = listOf("Mike", "Jane", "Marcin", "John", "James") numbers.onEach { print(it) } // 12345678910 println() names.onEach { print(it) } // MikeJaneMarcinJohnJames println() println(names.filter { it.startsWith("J") }) // [Jane, John, James] println(names.filter { it.startsWith("M") }) // [Mike, Marcin] println(names.flatMap { it.toList() }) // [M, i, k, e, J, a, n, e, M, a, r, c, i, n, J, o, h, n, J, a, m, e, s] println(numbers.flatMap { listOf(it, it + 10) }) // [1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9, 19, 10, 20] // println(names.map { it.toUpperCase() }) // [MIKE, JANE, MARCIN, JOHN, JAMES] // println(numbers.map { it * 10 }) // [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] val list = listOf(1, 2, 3) println(list.map { it * 2 }) // [2, 4, 6] println(list.map { "$it!" }) // [1!, 2!, 3!] println(list.map { it % 2 == 0 }) // [false, true, false] } class MapTest { @Test fun mapTests() { val numbers = 1..5 val names = listOf("Mike", "Jane", "Marcin", "John", "James") val upper = names.map { it.uppercase() } val doubled = numbers.map { it * 2 } assertEquals(listOf("MIKE", "JANE", "MARCIN", "JOHN", "JAMES"), upper) assertEquals(listOf(2, 4, 6, 8, 10), doubled) val list = listOf(1, 2, 3) assertEquals(list.map { it * 2 }, listOf(2, 4, 6)) assertEquals(list.map { "$it!" }, listOf("1!", "2!", "3!")) assertEquals(list.map { it % 2 == 0 }, listOf(false, true, false)) } }