Kotlin实例化不可变列表

alh*_*art 4 immutability kotlin

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

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

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

val valueList = arrayListOf(values)
// iterate through valuelist
Run Code Online (Sandbox Code Playgroud)

要么

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

除非我误解,否则这些最终MutableLists会有效,但感觉就像是一种解决方法.是否有类似的immutableListOf(Iterable<SomeObject>)方法将实例化一个不可变的列表对象?

hot*_*key 12

在Kotlin中,List<T>是一个只读列表界面,它不具有更改内容的功能,不像MutableList<T>.

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

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

例:

val iterable: Iterable<Int> = listOf(1, 2, 3)
val list: List<Int> = iterable.toList()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,只读列表非常适合实例化有效的不可变列表,但不适用于数据类或其他希望接收对不可变列表的引用的情况,因为 `MutableList&lt;T&gt;` 是一个 `List&lt;T&gt;`因此,如果构造函数、函数等要求`List&lt;T&gt;`,那么有人仍然可以传入`MutableList&lt;T&gt;`,然后再修改它。有关更多详细信息的示例,请参见 http://stackoverflow.com/questions/33727657/kotlin-and-immutable-collections/34027828#34027828。 (2认同)