帅气的目录
0、关键词
match和case
1、匹配常量
Scala
for (i <- 0 until 3){
val j = i match {
case 0 => "零蛋"
case 1 => "一血"
case _ => "五杀"
}
println(i + j)
Java
for (int i = 0; i < 3; i++) {
switch (i) {
case 0:
System.out.println(i + "零蛋");
break;
case 1:
System.out.println(i + "一血");
break;
default:
System.out.println(i + "五杀");
break;
}
}
Python
for i in range(3):
j = {
0: '零蛋',
1: '一血',
}.get(i, '五杀')
print(str(i) + j)
-
打印结果
-
0零蛋
1一血
2五杀
sql
SELECT
salary,
(CASE
WHEN salary>10000 THEN '(10k,+∞)'
WHEN salary>5000 THEN '(5k,10k]'
WHEN salary>3000 THEN '(3k,5k]'
ELSE '(-∞,3k]'
END) AS salary_section
FROM `employees`
;
2、匹配类型
def patternMatching(x: Any): String = x match {
case i: Int => i + " 是整数"
case i: String => i + " 是字符串"
case i: List[_] => i + " 是列表"
case i: Array[Int] => i.mkString("-") + " 数组"
case _ => "其它"
}
println(patternMatching(-1))
println(patternMatching("a"))
println(patternMatching(List(2, "b")))
println(patternMatching(Array(3,2)))
println(patternMatching(Array("c","b")))
-
打印结果
-
-1 是整数
a 是字符串
List(2, b) 是列表
3-2 数组
其它
3、匹配数组
def patternMatching(x: Array[Int]): String = x match {
case Array(10) => "精准匹配Array(10)"
case Array(x) => "匹配含1个元素的数组" + x
case Array(x, y) => "匹配含2个元素的数组" + x * y
case Array(9, _*) => "匹配以9开头的数组"
case a => a.mkString("-")
}
println(patternMatching(Array(10)))
println(patternMatching(Array(5)))
println(patternMatching(Array(7, 6)))
println(patternMatching(Array(9, 8 ,7,6)))
println(patternMatching(Array(10,9,8)))
-
打印结果
-
精准匹配Array(10)
匹配含1个元素的数组5
匹配含2个元素的数组42
匹配以9开头的数组
10-9-8
4、匹配元组
for (t <- Seq((0, 0), (5, 0), (5, 5), (0, 0, 1))) {
val x = t match {
case (0, b) => " 是第1个元素是0的两元元组 " + b
case (a, 0) => " 是第2个元素是0的两元元组 " + a
case (a:Int, b:Int) => " 是含2个元素的元组 " + (a * b)
case _ => " 是其它"
}
println(t + x)
}
-
打印结果
-
(0,0) 是第1个元素是0的两元元组 0
(5,0) 是第2个元素是0的两元元组 5
(5,5) 是含2个元素的元组 25
(0,0,1) 是其它
4.1、for匹配元组
for (("a", x) <- Seq(("a", 1), ("b", 2), ("c", 3), ("a", 4))) {
println(x)
}
-
打印结果
-
1
4
4.2、map匹配元组
val s: Seq[(String, Int)] = Seq(("a", 2), ("b", 3), ("a", 4))
val l: Seq[(String, Int)] = s.map {
case ("b", c) => ("b", c * 100)
case (w, c) => (w, c * 2)
}
println(l)
-
打印结果
- List((a,4), (b,300), (a,8))
5、声明变量时使用匹配模式
5.1、一行代码 赋值多个
Scala
val (a, b) = ("A", 2)
println(a)
println(b)
Python
a, b = 'A', 2
print(a)
print(b)
5.2、一行代码 从列表中赋值多个
Scala
def f(ls:List[Int]):Unit ={
val List(a, b, _*) = ls
println(a, b)
}
f(List(1, 2, 3, 4)) // (1,2)
f(List(5, 6, 7, 8, 9)) // (5,6)
Python
def f(ls):
a, b, *args = ls
print(a, b, args)
f([1, 2, 3, 4]) # 1 2 [3, 4]
f([5, 6, 7, 8, 9]) # 5 6 [7, 8, 9]
6、for表达式中的模式匹配
val map = Map("A" -> 1, "B" -> 0, "C" -> 3)
//全部k-v
for ((k, v) <- map) {
println(k + v)
}
//遍历value=0的k-v:B
for ((k, 0) <- map) {
println(k + " -> " + 0) //打印结果:B
}
//遍历v>=1的k-v:A和C
for ((k, v) <- map if v >= 1) {
println(k + " --> " + v)
}
7、偏函数中的模式匹配(工作常用)
- 英文名:partial function
- 简述:不完整的函数;函数的某个部分
//将列表中的Int类型的元素加1,并去掉字符串
val ls1 = List(1,2,3,4,5,"a")
val ls2 = ls1.collect { case x: Int => x + 1 }
791



被折叠的 条评论
为什么被折叠?



