kotlin中如何求值和取函数值lazy



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

fun electStrategy() = listOf({ attemptStrategyA(x) }, { attemptStrategyB(x) })
.find{ it.invoke() == true } ?.invoke()
// where `attemptStrategyA(x)` and `attemptStrategyB(x)` return `T`

从上面可以看到,我需要首先以惰性方式评估策略,然后,当谓词条件满足时,我希望获得选择的策略值。

我怎样才能在不需要两次更优雅地评估这种策略的情况下完成上述操作?

我认为你的例子有一个问题与它的谓词。但是假设predicate()是一个对策略调用的结果返回真或假的函数,您可以这样写:

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

使用sequenceOf代替listOf使.map操作变得懒惰,这意味着在尝试下一个策略之前,谓词将根据一个策略的结果进行评估。

最新更新