如何使用Deliverc过滤列表?

我有一大堆名字.如何使用Inbox方法制作过滤器并获取uri?

suspend fun getContactData(): List<ContactData> = coroutineScope {
    val names = async(Dispatchers.IO) { getNames() }.await()
    val emails = async(Dispatchers.IO) { getEmails() }.await()

    names.filter { contact -> emails[contact.id] != null }.map { contact ->
        val contactEmails = emails[contact.id].orEmpty()
        ContactData(
            contact = Contact(contact.id, contact.name, contactEmails, contactEmails),
            uri = getContactUri(contactEmails)
        )
    }
}

推荐答案

big是什么?当数据确实很大时,数据应该存储在带有索引的数据库中,然后可以通过SQL来进行过滤.

但是,如果内存中的列表仍然太大,无法在主线程上进行过滤,则可以将其移至默认调度器.没什么可做的了.您的协程将暂停,直到过滤完成,但它不会阻止主线程. 如果您不希望您的代码暂停,只需启动新的协同程序并从那里拨打getContactData即可.您可以在过滤完成后使用回调返回数据,或者启动带有async的协程并在稍后的某个时间等待结果.

如果您希望将过滤分布在多个线程上以加快速度,那么Kotlin目前不支持这一点.你们could人为此使用Java流(当然,只有当你们针对Java时),但我的经验是,这很少产生任何可衡量的改进.只有当您的过滤占用时间在秒范围内(您可能需要数百万个条目)时,您才应该考虑这一点.

也就是说,独立于协程和线程,您的过滤可以大大加快.您在names上迭代两次,names可以融合为单个mapNotNull,只需一次迭代即可完成映射和过滤:

suspend fun getContactData(): List<ContactData> {
    val names = getNames()
    val emails = getEmails()
    
    return withContext(Dispatchers.Default) {
        names.mapNotNull { contact ->
            emails[contact.id]?.let { email ->
                ContactData(
                    contact = Contact(contact.id, contact.name, email, email),
                    uri = getContactUri(email),
                )
            }
        }
    }
}

请注意,我删除了您用于getNamesgetEmails的Deliverc/await呼叫.这就是启动了一个新的协同程序,只是等待它完成.这不是协程的作用,您可以简单地使用当前的协程来实现这一目标,然后直接呼叫getNamesgetEmails.如果这是为了将执行转移到IO调度器,则实际上应该使用这些函数中的inside个中的withContext来执行这一操作,而不是在调用它们时.

Kotlin相关问答推荐

如何使用 Kotlin Maven 更改 Minecraft 插件中的 Shulker GUI 标题

Mockk:对同一函数进行两次存根会忽略第一个行为

Kotlin 说不需要强制转换,但删除后会出现新警告

在Kotlin lambda的参数中如何指定函数类型?

Kotlin 中的密封和内部有什么区别?

如何使用成员引用在 Kotlin 中创建属性的分层路径

如何将glide显示的图像下载到设备存储中.Kotlin

如果不为空,则为 builder 设置一个值 - Kotlin

JavaFX - 你如何在 Kotlin 中使用 MapValueFactory?

为什么 Kotlin 扩展运算符在传递原始可变参数时需要 toTypedArray()?

jetpack compose 将参数传递给 viewModel

零安全的好处

如何从定义它们的类外部调用扩展方法?

将 Firebase 数据快照反序列化为 Kotlin 数据类

将ExpectedException与Kotlin一起使用

使用主构造函数时使用Kotlin getter/setter

TypeConverter()在Android的TypeConverter错误中具有私有访问权限

有没有办法在Kotlin中设置一个私有常量

在多平台子元素中使用kapt

如何在 Kotlin 中定义新的运算符?