首页 文章

Kotlin实例化不可变列表

提问于
浏览
4

我已经开始使用Kotlin作为java的替代品并且非常喜欢它 . 但是,如果没有跳回到java-land,我一直无法找到解决方案:

我有 Iterable<SomeObject> 并需要将其转换为列表,因此我可以多次迭代它 . 这是一个不可变列表的明显应用,因为我需要做的就是多次读取它 . 我如何在开始时将这些数据实际放入列表中? (我知道's an interface, but I'已经无法在文档中找到它的实现)

可能的(如果不满意)解决方案:

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 回答

  • 12

    在Kotlin中,List<T>是一个只读列表接口,它没有用于更改内容的功能,这与MutableList<T>不同 .

    通常, List<T> 实现可能是一个可变列表(例如 ArrayList<T> ),但如果将其作为 List<T> 传递,则不会在不进行强制转换的情况下公开变异函数 . 这样的列表引用称为只读,表明列表不打算更改 . 这是immutability through interfaces被选为Kotlin stdlib的不变性方法 .

    更接近问题,stdlib中的 Iterable<T>toList()扩展函数将适合:它返回只读 List<T> .

    例:

    val iterable: Iterable<Int> = listOf(1, 2, 3)
    val list: List<Int> = iterable.toList()
    

相关问题