如何在Kotlin中计算和取lazy函数值

xxls0lw8  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(146)

我在我的个人项目中尝试实现的是一个“评估函数”,它应该选择一个有效的策略,而不需要调用两次。目前,我的代码是:

fun electStrategy() = listOf({ attemptStrategyA(x) }, { attemptStrategyB(x) })
                      .find{ it.invoke() == true } ?.invoke()

// where `attemptStrategyA(x)` and `attemptStrategyB(x)` return `T`

从上面的内容可以看出,我首先需要以一种懒惰的方式对策略进行求值,然后,当满足 predicate 条件时,我希望获得所选的策略值。
我怎样才能做到以上几点,而不必对这种策略进行两次更优雅的评估呢?

lh80um4z

lh80um4z1#

我认为你的例子在 predicate 上有问题,但是假设predicate()是一个在策略调用的结果上返回true或false的函数,你可以这样写:

fun electStrategy() = sequenceOf({ attemptStrategyA(x) }, { attemptStrategyB(x) })
    .map { it.invoke() }
    .firstOrNull { predicate(it) }

使用sequenceOf而不是listOf会使.map操作延迟,这意味着在尝试下一个策略之前,将对策略的结果计算 predicate 。

相关问题