Как вернуть новый список из другого списка?

#kotlin #collections

#kotlin #Коллекции

Вопрос:

У меня есть список целых чисел:

 // List<Int>
val listOfInts = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
  

и я хочу преобразовать это в другое List<String> , где у него есть только нечетные числа, такие как:

 // List<String>
val listOfStrings = listOf("1", "3", "5", "7", "9")
  

Пробовал:

 fun convertIntListToStringList(listOfInts: List<Int>): List<String> {
    return listOfInts.map{
        if (it.rem(2) == 0) it.toString()    
    }
}
  

Комментарии:

1. Поскольку вы хотите нечетное значение, оно должно быть! = 0

2. Другим решением является использование mapNotNull . listOfInts.mapNotNull{ if (it.rem(2) == 0) it.toString() else null; }

3. @Todd mapNotNull применяется к результату лямбда-выражения, а не к входному списку. @JTejedor также: mapNotNull{ it.takeIf { it % 2 == 0 } } . Но ИМО лучше избегать использования нулей для потока, если это возможно.

Ответ №1:

Попробуйте: listOfInts.filter { it % 2 == 1 }.map { it.toString() }

Комментарии:

1. Да — также все функции сбора, такие как map , filter и т. Д., Создают новые списки, За исключением тех, to в которых указано их имя ( mapTo , filterTo и т. Д.), Которые помещают результаты в изменяемую коллекцию, которую вы предоставляете