【问题标题】:How to back a MutableList<Uri> field with a MutableList<String>如何使用 MutableList<String> 支持 MutableList<Uri> 字段
【发布时间】:2021-06-05 02:08:46
【问题描述】:

我的界面是这样的:

interface MyObject {
    val id: String
    val media: MutableList<Uri>
}

我想实现它,其中媒体列表由MutableList&lt;String&gt; 而不是MutableList&lt;Uri&gt; 支持(我需要的原因在我的长问题here 中有解释)。简单的方法是:

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>
}

但这显然效率低下(例如,为了仅获取第一个元素,将对整个列表运行 map 操作)。我想到了get() = object : MutableList&lt;Uri&gt; {...},但我意识到我必须实现超过 20 个成员......有没有更好的方法来实现这一点?

【问题讨论】:

    标签: list kotlin inheritance interface uri


    【解决方案1】:

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

    val media = object : AbstractList<URL>() {
        override val size get() = mediaStringList.size
        override fun get(index: Int) = Uri.parse(mediaStringList[index])
    }
    

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

    与大多数性能问题一样,这是一种权衡:它本身不存储任何数据,但每次检索到一个项目时都需要创建一个新的Uri。因此,仅当您需要以额外处理为代价来节省内存时,这才是一个好主意;或者当列表与检索到的项目数量相比可能很大时。

    如果您希望视图可写,则可以改为扩展 AbstractMutableList,并覆盖另外三个方法。 (这留作练习:-)

    PS。我建议 initialising media 这个对象,而不是在 getter 中创建它,因为后者会在每次调用 getter 时创建一个新视图,这很浪费。 (如果您担心为每个 MyObjectPojo 创建单个视图,您可以将其包装在 by lazy {…} 中,以便仅在第一次需要时创建它 - 以一些同步为代价。)

    【讨论】:

    • 不错的解决方案!并感谢您的快速回复!我现在将实施它。 List&lt;T&gt;.firstOrNull() 之类的扩展应该可以正常工作(它们最后都建立在这 5 个成员之上)?实际上我并不需要节省内存,我的问题是我需要这个类作为我的 Firestore 'set()' & toObject() 操作的类型。不幸的是,他们似乎不支持 android.net.Uri 类型。如果您有比实施object : AbstractList&lt;Uri&gt; 更好的解决方案,请分享:)
    • @OmerLevy 是的,AbstractList 实现了所有其他 List 方法,就您需要覆盖的两个而言,等效于 AbstractMutableList — 尽管在某些情况下它可能更有效也覆盖其他一些方法。 (我不了解 Android,所以无法使用它的 API。)
    • @OmerLevy 顺便说一句,感谢您的支持和接受!尽管为了公平起见,我可能应该提一下,在这个网站上,通常最好推迟一天左右接受答案,给其他时区的人们一个机会。 (毕竟,其他人可能会想出一个比我更好的甚至答案,这似乎是不可能的:-)
    • 哈哈哈,你真好!好的,我会删除一两天的接受:)
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2016-01-21
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多