kotlin "содержит" не работает, как ожидалось - PullRequest
2 голосов
/ 13 апреля 2019

Я работаю с методом, который фильтрует настройки, совпадающие с идентификаторами, я использую метод contains, но даже если значения одинаковы, contains показывает false в каждой итерации,Метод выглядит следующим образом:

private fun filterPreferencesByIds(context: MyPodCastPresenterContext): List<FanPreferences> {
            return context.preferences?.filter {
                context.ids.contains(it.id)
            }
        }

Значения массивов:

для context.ids: "B52594F5-80A4-4B18-B5E2-8F7B12E92958" и "3998EDE7-F84B-4F02-8E15-65F535080100 "

enter image description here

А для context.preferences:

enter image description here

Но даже если первый и последний идентификаторы имеют то же значение идентификатора, что и context.ids, в отладке содержится значение false.Я думаю, это может быть связано с типами в context.ids строках Json$JsonTextNode.Потому что, когда я сделал то же самое с числовыми значениями, жестко закодированными, сравнение прошло успешно.

Есть идеи?

Спасибо!

1 Ответ

4 голосов
/ 13 апреля 2019

Если тип FanPreferences.id равен String, а тип элемента списка context.ids равен JsonTextNode, вы не найдете элемент, равный данной строке идентификатора, поскольку он не имеет типа String.

Попробуйте сопоставить свои контекстные идентификаторы со списком строк перед фильтрацией:

val ids = context.ids.map { it.toString() }.toSet()
return context.preferences?.filter {
    ids.contains(it.id)
}

Обратите внимание, что вызов toString() для JsonTextNode может быть не лучшим способом получить строковые данные из него. Лучше обратиться к документации API этого класса, чтобы выяснить это.

...