如何在 kotlin 中惰性求值并获取函数值

Lor*_*reV 1 java methods functional-programming kotlin

我在个人项目中试图实现的是“评估器功能”,它应该选择一个有效的策略,而无需调用两次。目前,我的代码是:

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

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

Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到上述,而不必两次更优雅地评估这样的策略?

Jof*_*rey 5

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

fun electStrategy() = sequenceOf({ attemptStrategyA(x) }, { attemptStrategyB(x) })
    .map { it.invoke() }
    .firstOrNull { predicate(it) }
Run Code Online (Sandbox Code Playgroud)

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