Как выполнить итерацию по списку объектов, но в указанном c поле Kotlin - PullRequest
0 голосов
/ 13 февраля 2020

Допустим, у меня есть список AccountDto (getContats () -> List), у каждого из которых есть столбец accountId

List<Int> list = accountsDao.getContactIds()

, и у меня есть список MessageDto, где messageDto имеет поле 'fromAccountId ». Я хочу l oop через messageList и найти то, что у меня есть от учетной записи, которой нет в моей БД.

getAccounts().value?.let {
            for ((every accountId from it.accountDto) in --(every fromAccountId in newMessages.list)--) {
                if (it.contains(newFromAccountId))
                    println("fount $newFromAccountId")
            }
        }

Есть ли элегантный способ сделать это в Kotlin ...?

1 Ответ

2 голосов
/ 13 февраля 2020

Вы используете вложенный loops, что не очень хорошая идея, поскольку временная сложность этой операции O(n^2), производительность будет очень быстро ухудшаться с увеличением размера lists.

Лучшим подходом за счет некоторой дополнительной памяти было бы сначала создать set всех accountId из вашего Database, а затем iterate вместо messageList и для каждой accoutId проверки, если set содержит это accountId.

// Store all the accountId's in a Set so that lookup is fast
var accountIds = getAccounts().map{it.accountId}.toSet()
// Iterate over the messageList and find the Id's that are not in Set
messageList.asSequence()
           .filter { !accountIds.contains(it.fromAccountId) }
           .forEach { println("fount $it") }
...