Kotlin实例化不可变列表

时间:2016-01-13 15:25:36

标签: immutability kotlin

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

我有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 个答案:

答案 0 :(得分:12)

在Kotlin中,List<T>只读列表界面,与MutableList<T>不同,它没有更改内容的功能。

一般来说,ArrayList<T>实现可能是一个可变列表(例如List<T>),但如果将其作为Iterable<T>传递,则不会有变异函数暴露而不铸造。这样的列表引用称为只读,表明列表不打算更改。这是immutability through interfaces,被选为Kotlin stdlib不变性的方法。

更接近问题,stdlib中List<T>的{​​{3}}扩展函数适合:它返回只读val iterable: Iterable<Int> = listOf(1, 2, 3) val list: List<Int> = iterable.toList()

示例:

$order = isset($_GET['orderBy']) && in_array($_GET['orderBy'], $orderBy) ? $_GET['orderBy'] : 'datum';
echo "Order by ". $order;