Почему поток kotlin оценивает предикат .all в true, если первый Iterable пуст - PullRequest
0 голосов
/ 03 марта 2020

У меня есть список объектов. importerResponse.applications пусто (размер = 0)

Это мой код:

        val isDeployed = importerResponse.applications
                .flatMap(Application::instances)
                .map(Instance::state)
                .all { state -> DEPLOYED == state }

isDeployed верно в этом случае. Как это может быть? Я хочу, чтобы оно приняло значение false, если applications пусто.

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Метод all может искать любой элемент, который не соответствует условию, поскольку у вас его нет, по умолчанию он имеет значение true.

Вы можете достичь того, чего хотите, выполнив что-то примерно так:

val isDeployed = importerResponse.applications
            .flatMap(Application::instances)
            .map(Instance::state)
            .let { it.size() > 0 && it.all { state -> DEPLOYED == state } }

Обратите внимание, что let позволяет повторно использовать одно и то же выражение, не пересчитывая его дважды.

1 голос
/ 03 марта 2020

Зачем тебе это? Все элементы в коллекции удовлетворяют вашему предикату.

Вы можете проверить документацию: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/all.html

Если вы хотите, вы можете явно проверить, что коллекция пуста.

Это должно дать вам то, что вы хотите:

val isDeployed = importerResponse.applications
                   .flatMap(Application::instances)
                   .map(Instance::state)
                   .count { state -> DEPLOYED == state } > 0```
0 голосов
/ 03 марта 2020

Может быть немного непонятно, почему «any» возвращает «false» в пустых коллекциях, но «all» возвращает true, потому что «all» кажется более ограничивающим, чем «any» (на основе человеческого языка).

Но если вы в качестве примера спросите «все ли люди в комнате - мужчины», это все равно верно, если комната пуста. 0 из 0 человек ВСЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...