我开始使用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>)
方法将实例化一个不可变的列表对象?
答案 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;