首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MutableList<Uri>字段备份MutableList<String>

如何使用MutableList<Uri>字段备份MutableList<String>
EN

Stack Overflow用户
提问于 2021-03-06 17:40:07
回答 1查看 109关注 0票数 1

我的界面看起来是这样的:

代码语言:javascript
复制
interface MyObject {
    val id: String
    val media: MutableList<Uri>
}

我想实现它,其中媒体列表是由MutableList<String>而不是MutableList<Uri>支持的(我需要的原因在我的长问题here中已经解释过了)。最简单的方法是:

代码语言:javascript
复制
data class MyObjectPojo(
    override val id: String,
    val mediaStringList: MutableList<String>
) : Tale {
    override val media: MutableList<Uri>
        get() = mediaStringList.map { Uri.parse(it) } as MutableList<Uri>
}

但是它显然效率低下(例如,为了只获得第一个元素,一个映射操作将对整个列表运行)。我想过get() = object : MutableList<Uri> {...},但我意识到我必须实现20多个成员.有什么更好的方法来实现这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-06 18:11:11

一种选择是扩展AbstractList,它可以很简单,如:

代码语言:javascript
复制
val media = object : AbstractList<URL>() {
    override val size get() = mediaStringList.size
    override fun get(index: Int) = Uri.parse(mediaStringList[index])
}

这为您提供了底层mediaStringList的只读视图:对它的任何更改都会立即反映在视图中。

与大多数性能问题一样,这也是一种权衡:它本身不存储任何数据,但每次检索项目时都需要创建一个新的Uri。因此,只有在需要节省内存而牺牲额外处理的情况下,或者当列表与检索到的项的数量相比时,才是一个好主意。

如果您希望视图是可写的,则可以扩展AbstractMutableList,并重写另外三个方法。

PS。我建议将media初始化到这个对象,而不是在getter中创建它,因为getter每次调用getter时都会创建一个新视图,这是很浪费的。 (如果您担心为每个MyObjectPojo创建一个视图,您可以将它封装在by lazy {…}中,以便只在第一次需要时才创建它--代价是一些同步)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66508729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档