为什么Kotlin流在第一个Iterable为空的情况下将.all谓词评估为true

问题描述 投票:0回答:3

我有一个对象列表。importerResponse.applications为空(大小= 0)

这是我的代码:

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

isDeployed在这种情况下为true。怎么会这样?如果applications为空,我希望它解析为false。

kotlin
3个回答
0
投票

您为什么要那个?集合中的所有元素都满足您的谓词。

您可以查看文档:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/all.html

如果需要,您可以明确检查集合是否为空


1
投票

all方法可能正在寻找任何不符合条件的元素,因为您没有任何条件,它默认为true。

您可以通过执行以下操作来实现所需的目标:

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

请注意,let允许您重复使用相同的表达式而无需重新计算两次。


0
投票

这可能有点令人困惑,为什么“ any”在空集合上返回“ false”,而“ all”返回true,因为“ all”似乎比“ any”(基于人类语言)更具局限性。

但是如果您举一个例子,“一个房间里的所有人是否都是男性”,那么如果房间是空的,那仍然是正确的。 0人中有0人为ALL。

© www.soinside.com 2019 - 2024. All rights reserved.