在Kotlin中过滤列表需要很长时间

1l5u6lss  于 12个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(105)

我正在做一个现有的项目。下面的功能需要很长时间。
所有其他API的响应显示不到两秒。但PersonalOffer花了很长时间才显示出来。我认为问题出在下面的排序上。Map也进行多次。

fun getPersonalOffers(): Flow<List<PersonalOffer>> {
        return personalOfferDao.getPersonalOffers().map { list ->
            list.mapNotNull { PersonalOffer.mapFromDB(it) }.sortedBy { it.expiryDate }.sortedByDescending { it.isPlus }
        }
    }

我如何改进它来减少它的编译时间。

  • 个人报价道.kt**
@Dao
interface PersonalOfferDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAll(offers: List<DBPersonalOffer>?)

    @Query("SELECT * FROM personal_offer_table")
    fun getPersonalOffers(): Flow<List<DBPersonalOffer>>

    @Query("DELETE FROM personal_offer_table")
    suspend fun deleteAll()
}

DBPersonalOffer.kt**

@Entity(tableName = DBPersonalOffer.TABLE_NAME)
data class DBPersonalOffer(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "disclaimerText")
    val disclaimerText: String?,
    @ColumnInfo(name = "extraInfoText")
    val extraInfoText: String?,
    @ColumnInfo(name = "discountName")
    val discountName: String?,
    @ColumnInfo(name = "discountPercent")
    val discountPercent: String?,
    @ColumnInfo(name = "expiryDate")
    val expiryDate: String?,
    @ColumnInfo(name = "futureTeaserText")
    val futureTeaserText: String?,
    @ColumnInfo(name = "prizeId")
    val prizeId: String?,
    @ColumnInfo(name = "productName")
    val productName: String?,
    @ColumnInfo(name = "teaserText")
    val teaserText: String?,
    @ColumnInfo(name = "flowType")
    val flowType: String?,
    @ColumnInfo(name = "completeText")
    val completeText: String?,

    @Embedded(prefix = "images_")
    val images: DBPersonalOfferImages?,
) {
    companion object {

        const val TABLE_NAME = "personal_offer_table"

        fun mapHttpResponse(response: NetworkPersonalOffer): DBPersonalOffer {
            return DBPersonalOffer(
                disclaimerText = response.disclaimerText,
                discountName = response.discountName,
                discountPercent = response.discountPercent,
                expiryDate = response.expiryDate,
                futureTeaserText = response.futureTeaserText,
                prizeId = response.prizeId,
                productName = response.productName,
                teaserText = response.teaserText,
                flowType = response.flowType,
                completeText = response.completeText,
                images = DBPersonalOfferImages.mapHttpResponse(response.imageUrls),
                extraInfoText = response.extraInfoText
            )
        }
    }
}

个人优惠.kt

@Parcelize
data class PersonalOffer(
    val id: Int,
    val disclaimerText: String?,
    val discountName: String?,
    val discountPercent: String?,
    val expiryDate: Date?,
    val futureTeaserText: String?,
    val prizeId: String?,
    val productName: String?,
    val teaserText: String?,
    val images: PersonalOfferImages?,
    var isPlus: Boolean,
    var flowType: String?,
    var completeText:String?,
    var extraInfoText:String?
) : Parcelable ,TrackableObject(){

    companion object {
        fun mapFromDB(dbPersonalOffer: DBPersonalOffer?): PersonalOffer? {
            dbPersonalOffer?.let {

                val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK)
                var expiryDate: Date? = try {
                    sdf.parse(it.expiryDate)
                } catch (ex: Exception) {
                    null
                }

                return PersonalOffer(
                    id = it.id,
                    disclaimerText = it.disclaimerText,
                    discountName = it.discountName,
                    discountPercent = it.discountPercent,
                    expiryDate = expiryDate,
                    futureTeaserText = it.futureTeaserText,
                    prizeId = it.prizeId,
                    productName = it.productName,
                    teaserText = it.teaserText,
                    isPlus = it.flowType == "Club Matas Plus",
                    completeText = it.completeText?:"",
                    flowType = it.flowType,
                    images = PersonalOfferImages.mapFromDB(it.images),
                    extraInfoText = it.extraInfoText
                )
            } ?: run {
                return null
            }
        }
    }

    override fun getClickEventName() = "personal_offer_in_store_mode_clicked"

    override fun getViewEventName() = "personal_offer_in_store_mode_viewed"

    override fun getTrackParams(): MutableSet<Pair<String, Any>> = mutableSetOf(
        Pair("name", discountName ?: ""),
        Pair("prize_id", prizeId ?: "")
    )
}
nue99wik

nue99wik1#

您可以通过编写将执行所需过滤的查询来将过滤器逻辑移动到数据库,您还可以保存实体上isPlus的布尔值,以便仅从数据层过滤一次

@Query("SELECT * FROM personal_offer_table ORDER BY date(expiryDate) ASC, isPlus DESC")
fun getPersonalOffersSorted(): Flow<List<DBPersonalOffer>>

相关问题