为了账号安全,请及时绑定邮箱和手机立即绑定

Kotlin和不可变集合?

/ 猿问

Kotlin和不可变集合?

回首忆惘然 2019-11-19 15:02:05

我正在学习Kotlin,看起来我可能希望在明年使用它作为我的主要语言。但是,关于Kotlin是否具有不可变集合的研究一直存在矛盾,并且我试图找出是否需要使用Google Guava。

有人可以给我一些指导吗?默认情况下是否使用不可变集合?哪些运算符返回可变或不可变的集合?如果没有,是否有实施这些计划的计划?


查看完整描述

3 回答

?
天天世纪

List标准库中的Kotlin 是只读的:


interface List<out E> : Collection<E> (source)

元素的一般有序集合。此接口中的方法仅支持对列表的只读访问;请参见 通过MutableList接口支持读/写访问。


参数

E-列表中包含的元素的类型。


如前所述,还有 MutableList


interface MutableList<E> : List<E>, MutableCollection<E> (source)

元素的通用有序集合,支持添加和删除元素。


参数

E-列表中包含的元素的类型。


因此,Kotlin通过其接口强制执行只读行为,而不是像默认Java实现那样在运行时抛出异常。


同样,有MutableCollection,MutableIterable,MutableIterator,MutableListIterator,MutableMap,和MutableSet,看到STDLIB文档。


查看完整回答
反对 回复 2019-11-19
?
料青山看我应如是

这很令人困惑,但是有三种而不是两种不变性:

  1. 可变-您应该更改集合(科特琳的MutableList

  2. 只读-您不应该更改它(Kotlin的List),但可以更改某些内容(广播到Mutable或从Java更改)

  3. 不可变-没人可以更改它(番石榴的不可变集合)

因此,在情况(2)List中只是一个没有变异方法的接口,但是如果将实例强制转换为,则可以更改实例MutableList

使用番石榴(案例(3)),即使使用演员表或其他线程,您也可以安全地更改任何集合。

Kotlin选择为只读以便直接使用Java集合,因此使用Java集合不会产生任何开销或转换。


查看完整回答
反对 回复 2019-11-19
?
呼如林

正如您在其他答案中看到的那样,Kotlin具有可变集合的只读接口,使您可以通过只读镜头查看集合。但是,可以通过强制转换或通过Java来操纵集合。但是在很好的协作式Kotlin代码中,大多数使用并不需要真正不可变的集合,如果您的团队避免了对可变形式的集合进行强制转换,那么也许您就不需要完全不可变的集合。


Kotlin集合允许同时复制复制突变和惰性突变。因此,为了您的问题的答案的一部分,像filter,map,flatmap,运营商+ -都针对非懒集合时创建的副本。当在a上使用时,Sequence它们会在访问值时将值修改为集合,并且会继续保持惰性(导致另一个Sequence)。虽然一Sequence,调用的内容,如toList,toSet,toMap会导致所取得的最终副本。通过命名约定,几乎所有以它开头的东西都to在制作副本。


换句话说,大多数运算符会返回与您开始时相同的类型,如果该类型为“只读”,则您将收到一个副本。如果该类型是惰性的,那么您将延迟应用更改,直到您需要完整的集合为止。


有些人出于其他原因(例如并行处理)而需要它们。在这些情况下,最好查看专为这些目的而设计的真正高性能的集合。并且仅在那些情况下使用它们,而不是在所有一般情况下使用它们。


在JVM世界中,很难避免与需要标准Java集合的库进行互操作,并且向/从这些集合进行转换会给不支持公共接口的库增加很多痛苦和开销。Kotlin很好地融合了互操作性和缺乏转换的特性,并具有按合同提供的只读保护。


因此,如果您无法避免想要不可变的集合,那么Kotlin可以轻松地使用JVM空间中的任何东西:


番石榴(https://github.com/google/guava)

Dexx的Scala集合到Java(的端口https://github.com/andrewoma/dexx)与科特林佣工(https://github.com/andrewoma/dexx/blob/master/kollection/README.md)

Eclipse Collections(以前是GS-Collections)是一种真正高性能,与JDK兼容的顶级性能,具有不变和可变的变体(并行:https://www.eclipse.org/collections/和Github:https://github.com)。 com / eclipse / eclipse-collections)

PCollections(http://pcollections.org/)

同样,Kotlin团队正在为Kotlin本地开发Immutable Collections,可以在以下网址看到该成果:https : //github.com/Kotlin/kotlinx.collections.immutable


还有许多其他收集框架可以满足所有不同的需求和约束,Google是您寻找它们的朋友。Kotlin团队没有理由为标准库重新发明它们。您有很多选择,它们专注于不同的方面,例如性能,内存使用,非装箱,不变性等。“选择就是好” ...因此还有其他选择: HPCC,HPCC-RT,FastUtil,Koloboke,Trove和更多...


由于Kotlin现在支持Annotation处理,因此甚至有类似Pure4J的努力,也许可以为类似的理想而移植到Kotlin。


查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信