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