模式匹配通常与文本搜索有关。 在Scala中,它的用法要复杂得多。 与案例类一起使用时,您可以编写令人兴奋的决策逻辑。 即使在理解了这两件事的含义之后,我还是无法使用它们应有的价值。 真正掌握它们需要一些时间。 漫长而曲折的道路。
当必须编写复杂的代码时,案例类可以轻松进行模式匹配。 有关介绍,请参见官方文档 。 让我们看一些更有趣的例子。
案例类除外
case class MyException(msg: String) extends Exception(msg)
原因是异常捕获实际上是模式匹配。 捕获块包含模式,如果存在匹配,则执行相关代码段。 以下代码演示了这一点。 当异常是RuntimeException或IOException时,第二种情况匹配。
try { ...
} catch {
case ex: MyException => Logger.error(ex.toString)
case ex @ (_ : SQLException | _ : IOException) => println(ex)
}
普通的旧数据持有人
如果将一个类设计为只是一个没有任何方法的数据持有人,则建议将其作为案例类。 从句法上讲,构造新实例更容易,并且根据定义,可以从外部访问案例类的构造函数参数。 也可以使用模式匹配在结构上分解它们。 这非常方便。
结构分解
模式不仅用于指定条件,还用于分解要匹配的对象。 以下示例尝试根据提供的键在地图中查找元组。 如果找到一个,则返回元组的第二项,即字符串。 那就是分解。 如果找不到任何内容,则返回N / A。 如果您好奇为什么会有双括号((...)),则原因是外括号表示函数调用,而内括号表示两个项目的元组。
def getValue(key: Int, data: Map[Int, (Int, String)]): String = {
data.get(key) match {
case Some((num, text)) => text
case _ => "N/A"
}
}
这两个生物在我的代码中越来越多地出现。 是的,不要忘记,如果您检查前面的代码,您会看到该函数应该返回一个字符串,但是没有return语句。 在Scala中,结果值是最后一条语句的值。 在这里,根据模式匹配,我们还有更多的最后一条语句,但是我们涵盖了所有可能的执行路径,并且始终返回字符串。 编译器很高兴,我们也很高兴。
翻译自: https://www.javacodegeeks.com/2013/09/scala-wonderland-case-classes-and-pattern-matching.html