【问题标题】:Kotlin Instantiate Immutable ListKotlin 实例化不可变列表
【发布时间】:2016-01-13 15:25:35
【问题描述】:

我已经开始使用 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&lt;SomeObject&gt;) 方法可以实例化不可变列表对象?

【问题讨论】:

标签: immutability kotlin


【解决方案1】:

在 Kotlin 中,List&lt;T&gt; 是一个只读列表接口,它没有改变内容的功能,不像MutableList&lt;T&gt;

一般来说,List&lt;T&gt; 实现可能是一个可变列表(例如ArrayList&lt;T&gt;),但如果您将它作为List&lt;T&gt; 传递,则不会在没有强制转换的情况下公开任何变异函数。这样的列表引用称为只读,表明该列表不会被更改。这是immutability through interfaces,它被选为 Kotlin 标准库的不变性方法。

更接近问题的是,stdlib 中Iterable&lt;T&gt;toList() 扩展函数将适合:它返回只读List&lt;T&gt;

例子:

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

【讨论】:

  • 请注意,只读列表非常适合实例化有效的不可变列表,但不适用于数据类或其他您希望接收不可变列表引用的情况,因为 MutableList&lt;T&gt; 是 @ 987654336@ 因此,如果构造函数、函数等请求List&lt;T&gt;,仍然有人可以传入MutableList&lt;T&gt; 并稍后对其进行修改。有关更多详细信息的示例,请参阅stackoverflow.com/questions/33727657/…
猜你喜欢
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2020-02-07
  • 2017-05-16
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多