gpt4 book ai didi

scala - 如何使这个 first-not-null-result 函数更优雅/简洁?

转载 作者:行者123 更新时间:2023-12-01 06:55:45 28 4
gpt4 key购买 nike

getFirstNotNullResult 执行函数列表,直到其中一个函数返回非空值。
如何更优雅/简洁地实现 getNotNullFirstResult?

object A {
def main(args: Array[String]) {
println(test());
}

def test(): String = {
getFirstNotNullResult(f1 _ :: f2 _ :: f3 _ :: Nil);
}

def getFirstNotNullResult(fs: List[() => String]): String = {
fs match {
case head::tail =>
val v = head();
if (v != null) return v;
return getFirstNotNullResult(tail);

case Nil => null
}
}

// these would be some complex and slow functions; we only want to execute them if necessary; that is, if f1() returns not null, we don't want to execute f2 nor f3.
def f1(): String = { null }
def f2(): String = { "hello" }
def f3(): String = { null }
}

最佳答案

我喜欢 Rex 的回答,但是您的问题提出了很多问题,我想对其进行扩展,添加:

  • 使用 Scala 的 Option/Some/None类以阐明在未找到匹配项时应返回的内容。您的示例返回 null,Rex 抛出异常。使用 Option 可以立即明确我们将返回匹配项或“无”。
  • 使用类型参数,这样您就不必只对返回字符串的函数进行操作。

  • 这是代码:
    object A extends App {
    def getFirstNNWithOption[T](fs: List[() => Option[T]]): Option[T] = fs
    .view //allows us to evaluate your functions lazily: only evaluate as many as it takes to find a match
    .flatMap(_()) //invoke the function, discarding results that return None
    .headOption // take the first element from the view - returns None if empty

    def f1 = { println("f1"); None }
    def f2 = Some("yay!")
    def f3 = { println("f2"); None }

    println(getFirstNNWithOption(List(f1 _, f2 _, f3 _)))
    }

    请注意,当此代码运行时, f2 永远不会打印,这表明,由于 .view 调用,我们在返回匹配项之前评估了最少的函数数。

    请注意,此方法的调用者现在必须考虑可能找不到匹配项的事实:我们返回 Option[T] 而不是返回 T。在我们上面的例子中,它会返回 Some("yay")。当所有函数都返回 None 时,返回值将为 None。当您将 null 误认为实际匹配时,不再出现 NullPointerExceptions!

    关于scala - 如何使这个 first-not-null-result 函数更优雅/简洁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715562/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com