每个人都说模式匹配是功能语言中的一个很棒的功能。为什么?
我不能简单地使用ifs并切换所有内容的大小写吗?
我想了解使用模式匹配而不是常规过程编程ifs和switch case的优势
我首先要注意的是,您不会使用模式匹配来代替switch语句。 Scala没有switch
语句,它具有的是match块,其内部的情况从表面上看与switch语句非常相似。
具有模式匹配的匹配块可以完成switch
的所有工作,以及更多。
A)不仅仅限于Oracle选择在语言规范中“祝福”的原语和其他类型。(字符串和枚举)。如果您想根据自己的类型进行匹配,请继续!
B)模式匹配也可以提取。例如,使用元组:
val tup = ("hello world", 42)
tup match {
case (s,i) =>
println("the string was " + s)
println("the number was " + i
}
带有列表:
val xs = List(1,2,3,4,5,6)
xs match {
case h :: t =>
// h is the head: 1
// t is the tail: 2,3,4,5,6
// The :: above is also an example of matching with an INFIX TYPE
}
带有案例类
case class Person(name: String, age: Int)
val p = Person("John Doe", 42)
p match {
case Person(name, 42) =>
//only extracting the name here, the match would fail if the age wasn't 42
println(name)
}
C]模式匹配可用于值赋值和理解],而不仅限于匹配块:
val tup = (19,73) val (a,b) = tup for((a,b) <- Some(tup)) yield a+b // Some(92)
D)匹配块是表达式,而不是语句
这意味着他们对匹配的任何一个案例的主体都进行评估,而不是完全通过副作用来行动。这对于函数式编程至关重要!
val result = tup match { case (a,b) => a + b }
以某种方式我对@KevinWright答案的编辑/添加被扔掉了,所以我将其添加为另一个更好的模式匹配功能...
模式匹配
正如在其他答案中所写的那样,Scala模式匹配和Java切换不会产生相同的效果。
JMPL是简单的Java库,可以使用Java 8功能来模拟某些功能模式匹配。