Intereting Posts
Мои входы не распознаются латинит, ленивый и одноэлементный узор в котлине Android Kotlin как установить флажок в режиме просмотра нескольких вариантов Отключить инкрементную сборку для kapt Целевые аннотации с использованием сайта недоступны с отражением Котлина Модуль должен быть установлен Броски Исключение в методе с Котлином Enum аннотации в Котлине RxJava с использованием Kotlin – как синхронизировать 2 асинхронных метода, рефакторинг с Java Вызывающая (базовая) делегированная функция при использовании делегирования класса из переопределения Android Room – выбор запроса с помощью LIKE Как получить доступ к представлению из макета, указанного в headerLayout NavigationView с помощью Kotlin в Android Почему у меня нет нулевой сцены? Как передать интерфейс в моем адаптере Kotlin RecylerView и получить обратный вызов в деятельности Kotlin RxJava: как вернуть правильный тип null

Создать метод с общим параметром для повторных действий

У меня есть следующие методы для моего кода:

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, и в зависимости от изменения типа класс, который мне нужно сработать? Что-то вроде этого:

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

Вам нужно извлечь интерфейс и использовать общий набор.

 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)