Kotlin Flow的first函数predicate参数需要返回什么布尔值?
Kotlin Flow
first() 函数闭包返回值说明 你代码中闭包末尾返回的布尔值是first()高阶函数的谓词筛选条件,作用是告知Flow当前收到的元素是否符合你的预期:
- 返回
true:代表当前元素满足要求,first()会立即终止流的收集,同时将当前元素作为返回值返回 - 返回
false:代表当前元素不满足要求,Flow会继续保持监听状态,等待下一个元素发射
结合你给出的官方源码可以明确执行逻辑:
first()内部通过collectWhile收集流,每次收到元素都会调用你传入的闭包:
- 如果闭包返回true,就把当前元素存为结果,向
collectWhile返回false终止收集- 如果闭包返回false,就向
collectWhile返回true,继续等待下一个元素- 如果流全部发射完都没有元素让闭包返回true,就抛出
NoSuchElementException
你当前代码里固定返回true,逻辑就是「只要Flow发射第一个元素,就直接匹配成功,处理完数据就终止流收集」,刚好完全匹配你“首次拿到数据就不再继续监听流”的需求,所以运行不会有问题。
如果后续你有筛选需求,比如需要等到满足特定条件的元素出现才终止收集,就可以修改这个返回值。比如你要等到分组列表里包含id为1的根分组才处理数据,可以改成:
.first { newList -> val hasRootGroup = newList.any { it.id == 1 } if (hasRootGroup) { // 只有符合条件才处理数据 groupData.clear() newList.forEach { newGroupData -> groupData[newGroupData.id] = newGroupData.name } } hasRootGroup // 只有匹配到根分组才终止收集 }
如果怕流没有符合条件的元素抛出异常,可以改用firstOrNull(),匹配不到时会直接返回null不会崩溃,不需要额外捕获异常。
内容的提问来源于stack exchange,提问作者Isaac Lee
相关产品推荐
相关产品推荐

