Список неизменных Kotlin

Я начал использовать Kotlin вместо Java, и мне это очень нравится. Тем не менее, я не смог найти решение этой проблемы, не вернувшись обратно в java-страну:

у меня есть Iterable<SomeObject> и нужно преобразовать его в список, чтобы я мог повторять его более одного раза. Это очевидное применение неизменяемого списка, так как все, что мне нужно сделать, это прочитать его несколько раз. Как мне на самом деле поместить эти данные в список в начале? (Я знаю, что это интерфейс, но я не смог найти его реализацию в документации)

Возможные (если неудовлетворительные) решения:

val valueList = arrayListOf(values)
// iterate through valuelist

или же

fun copyIterableToList(values: Iterable<SomeObject>) : List<SomeObject> {
    var outList = ArrayList<SomeObject>()
    for (value in values) {
        outList.add(value)
    }
    return outList
}

Если я не неправильно понимаю, это в конечном итоге MutableLists, который работает, но чувствует себя как обходной путь. Есть ли подобное immutableListOf(Iterable<SomeObject>) метод, который будет создавать экземпляр неизменяемого объекта списка?

1 ответ

Решение

В Котлине List<T> является интерфейсом списка только для чтения, в отличие от содержимого, в отличие от MutableList<T>,

В общем, List<T> реализация может быть изменяемым списком (например, ArrayList<T>), но если вы передадите это как List<T>, никакие мутирующие функции не будут выставлены без приведения. Такая ссылка на список называется " только для чтения" и указывает, что список не подлежит изменению. Это неизменность через интерфейсы, которые были выбраны в качестве подхода к неизменности для Kotlin stdlib.

Ближе к вопросу, toList() функция расширения для Iterable<T> в stdlib поместится: возвращает только для чтения List<T>,

Пример:

val iterable: Iterable<Int> = listOf(1, 2, 3)
val list: List<Int> = iterable.toList()
Другие вопросы по тегам