Scala 如何使用惰性初始化对元组进行模式匹配?

Scala 如何使用惰性初始化对元组进行模式匹配?,scala,pattern-matching,lazy-initialization,Scala,Pattern Matching,Lazy Initialization,我有一个场景,我需要调用多达三个服务来做一些事情。每个服务都有某种优先级,我的算法取决于每个服务结果的组合(所有服务,两个甚至一个)。为了处理这种情况,我想使用模式匹配(因为匹配和变量提取) 这里是一个简化的例子 case class Foo(bar: String, baz: Option[String]) def expensiveOperation1(): String = ??? def expensiveOperation2(): List[Int] = ??? def expens

我有一个场景,我需要调用多达三个服务来做一些事情。每个服务都有某种优先级,我的算法取决于每个服务结果的组合(所有服务,两个甚至一个)。为了处理这种情况,我想使用模式匹配(因为匹配和变量提取)

这里是一个简化的例子

case class Foo(bar: String, baz: Option[String])

def expensiveOperation1(): String = ???
def expensiveOperation2(): List[Int] = ???
def expensiveOperation3(): Foo = ???

lazy val r1 = expensiveOperation1()
lazy val r2 = expensiveOperation2()
lazy val r3 = expensiveOperation3()

(r1, r2, r3) match {
  case ("Value1", _, _)          => "1"
  case ("Value2", _, _)          => "2"
  case (_, List(1), _)           => "3"
  case (_, Nil, _)               => "4"
  case ("Value3", 1 :: tail, _)  => "5" + tail
  case (_, _, Foo("x", Some(x))) => x
  case (_, _, _)                 => "7"
}
如您所见,不需要一直调用expensiveOperation2和expensiveOperation3,但尽管我将每个结果保存在惰性VAL上,但在创建Tuple3时,每个方法都会被调用

为了解决这个问题,我可以创建一个包含三个参数的容器LazyTuple3,通过名称调用,但我会遇到一个新问题,unapply方法(LazyTuple3.unapply)返回一个选项,因此在第一个“case”之后,将调用每个方法

我可以用嵌套的“如果”或“匹配”来解决这个问题,但我想用一个“匹配”来给一个机会,我发现它更清晰

有什么想法吗


提前感谢。

尝试使用
scalaz。需要

这将打印:

    operation1
    operation2
    operation1
    operation2