为重复操作创建具有通用参数的方法

Create method with generic parameter for repeated actions

我的代码中有以下方法:

fun saveArticles(data: JSONArray) {
    var active = String()
    for (i in 0..data.length().minus(1)) // create string

    val articles = Select.from(Article::class.java).list()

    val iterator = articles.iterator()
    while (iterator.hasNext()) {
        val article = iterator.next() as Article
        if (!active.contains(Regex(article.id.toString()))) article.delete()
    }
}

fun saveDossiers(data: JSONArray) {
    var active = String()
    for (i in 0..data.length().minus(1)) // create string

    val dossiers = Select.from(Dossier::class.java).list()

    val iterator = dossiers.iterator()
    while (iterator.hasNext()) {
        val dossier = iterator.next() as Dossier
        if (!active.contains(Regex(dossier.id.toString()))) dossier.delete()
    }
}

fun saveVideos(data: JSONArray) {
    var active = String()
    for (i in 0..data.length().minus(1)) // create string

    val videos = Select.from(Video::class.java).list()

    val iterator = videos.iterator()
    while (iterator.hasNext()) {
        val video = iterator.next() as Video
        if (!active.contains(Regex(video.id.toString()))) video.delete()
    }
}

如您所见,所有方法都做完全相同的事情。唯一的区别是我目前正在处理的对象的 Class 类型。我能以某种方式创建一个参数为 Class 类型的方法,并根据类型更改我需要工作的 class 吗?像这样:

fun saveVideos(data: JSONArray, type: Class) {
    var active = String()
    for (i in 0..data.length().minus(1)) // create string

    val list = Select.from(type).list()

    val iterator = list.iterator()
    while (iterator.hasNext()) {
        val item = iterator.next() as type
        if (!active.contains(Regex((item as type).id.toString()))) item.delete()
    }
}

您需要提取接口并使用 reified 泛型。

interface Blabla {
    fun delete()
    val id: Int
}

inline fun <reified T : Blabla>saveVideos(data: JSONArray) {
    var active = String()
    for (i in 0..data.length().minus(1)) // create string

    val list = Select.from(T::class.java).list()

    val iterator = list.iterator()
    while (iterator.hasNext()) {
        val item = iterator.next() as T
        if (Regex(item.id.toString()) !in active) item.delete()
    }
}

这应该有效。

此外,我强烈建议您使用 Kotlin 集合库,就像这样。

inline fun <reified T : Blabla>saveVideos(data: JSONArray) {
    val active = ""
    for (i in 0 until data.length()) {} // create string

    val list = Select.from(T::class.java).list()

    list
            .map { it as T }
            .filter { Regex(it.id.toString()) !in active }
            .forEach { it.delete() }
}

您甚至可以将 forEach { it.delete() } 替换为 forEach(T::delete)