Kotlin идиоматический способ обработки коллекции, пока выполняется некоторое условие - PullRequest
0 голосов
/ 22 мая 2018

Я хотел бы выполнить преобразование для объектов в коллекции, если есть объекты, которые удовлетворяют предикату.

После вызова transform(x) предикат больше не сохраняется для x, но может содержатьдля некоторого другого y, для которого это не держалось прежде.Однако алгоритм гарантированно завершится.

Как это можно улучшить?

while( col.any (p -> predicate(p)) ) {
    val member = col.find { p -> predicate(p) }!!
    transform(member)
}

РЕДАКТИРОВАТЬ:

Сочетая ответы @jonrsharpe и @hotkey, все перечисленные ниже являются более краткими и эффективными

do {
    val member = col.find { predicate(it) }?.also { transform(it) }
} while (member != null)


do {
} while (col.find { predicate(it) }?.also { transform(it) } != null)



while (col.find { predicate(it) }?.also { transform(it) } != null) {}

1 Ответ

0 голосов
/ 22 мая 2018

В дополнение к тому, что @ jonrsharpe сказано в комментарии, ваш код, кажется, ищет элемент, который соответствует predicate дважды на каждой итерации, сначала в any, а затем в find (они находят один и тот же предмет).

Вы можете уменьшить его до одного поиска с помощью find:

do {
    val member = col.find { predicate(it) }?.also { transform(it) }
} while (member != null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...