Проверять списки объектов для равенства без проверки ордера в свойстве List

Предпосылки. Я десериализую сложный json в класс данных. Класс назначения имеет несколько сложную иерархию.

У меня есть список объектов List. Где ServiceFeature является следующим (это в kotlin, но не имеет значения):

data class ServiceFeature( val flagValue: String?, val effectiveFlagValue: String?, val name: String?, val attributes: List<Attribute?>? ) 

Как вы можете видеть, ServiceFeature имеет свойство «attributes», которое включает другой список «Attribute». Главное, что атрибуты в списке могут быть в любом порядке. Есть ли надежный способ сравнить два списка ServiceFeatures без проверки заказа из списка

Я пытаюсь найти решение с assertJ.

Заранее спасибо.

Если заказ не имеет значения для ваших атрибутов, и они уникальны (т. Е. Могут не иметь нескольких атрибутов одного и того же типа), вы можете вместо этого изменить структуру в Set<Attribute?> И просто использовать регулярное сравнение.

Если вы хотите сохранить порядок, но сравнить (уникальные) атрибуты, которые вы можете преобразовать, чтобы их установить при сравнении, см. Самый простой способ преобразования списка в набор на Java .

Если порядок элементов не имеет значения, вы можете использовать Set вместо List . Сказав это, вы можете использовать метод containsExactlyInAnyOrder (), предоставленный AssertJ. Этот метод ожидает var-args в качестве аргумента, поэтому для преобразования списка в массив мы можем использовать toTypedArray вместе с оператором распространения Eg

 import org.junit.Test import org.assertj.core.api.Assertions.* data class ServiceFeature( val flagValue: String?, val effectiveFlagValue: String?, val name: String?, val attributes: List? ) data class Attribute(val name: String?) class SimpleTest { @Test fun test() { val list1 = listOf(ServiceFeature("flagA", "effectiveFlagA", "foo", listOf(Attribute("a"), Attribute("b")))) val list2 = listOf(ServiceFeature("flagA", "effectiveFlagA", "foo", listOf(Attribute("b"), Attribute("a")))) list1.zip(list2).forEach { assertThat(it.first.name).isEqualTo(it.second.name) assertThat(it.first.effectiveFlagValue).isEqualTo(it.second.effectiveFlagValue) assertThat(it.first.name).isEqualTo(it.second.name) val toTypedArray = it.second.attributes!!.toTypedArray() // null-check as per your need assertThat(it.first.attributes).containsExactlyInAnyOrder(*toTypedArray) } } } 
Intereting Posts
Как выбрать другой модуль для запуска, когда вы нажимаете кнопку «Выполнить» в IntelliJ IDEA? Как работает синтаксис доступа к свойствам Kotlin для классов Java (например, EditText setText)? Сохранить сторонний объект в ORM notifyDataChanged () не удалось обновить данные расширяемого списка Имущество должно быть инициализировано или быть абстрактным Как обрабатывать дублированный класс перед компиляцией kotlin-android? error: не удается найти класс символов для добавления класса kotlin в класс java в android studio 3.0 stable Именование условия if-value для использования в if block Проблема с типом номера телефона в Android DigestUtils.md5Hex () генерирует неправильное значение хэша при передаче объекта String Как настроить версию кода байта Kotlin в проекте Gradle на Java 8? Ошибка «Расширение с именем» android «не существует» при добавлении проекта Kotlin в Android Kotlin: возможно ли иметь постоянное свойство, зависящее от типичного типа реализации? Котлин – ожидание объявления участника Обеспечивает ли Kotlin повышение производительности?