package scala
import java.io
object Demo27Match {
def main(args: Array[String]): Unit = {
/**
* java中的模式匹配可以匹配,基本数据类型,字符串,枚举
*
* scala中的模式匹配,可以匹配基本数据类型,字符串,枚举,匹配对象,匹配类型
*
* 按照顺序匹配,只会匹配成功一个
* 如果前面没有匹配成功会走下划线
*
*/
/**
* 1、匹配基本数据类型
*/
val i = 100
i match {
case 1 => {
println("i等于1")
}
case 100 => println("i等于100")
//如果前面没有匹配成功匹配下划线
case _ => println("默认")
}
/**
* 2、匹配字符串
*
*/
val str = "java"
str match {
case "java" => println("java")
case "scala" => println("scala")
case _ => println("其它")
}
/**
* 3、匹配对象
*
*/
case class User(id: String, name: String)
val user: User = User("001", "张三")
user match {
case User("001", "张三") => println("张三")
case User("002", "李四") => println("李四")
case _ => println("其它")
}
/**
* 4、匹配类型
*
*/
val j: Any = 100.1
j match {
//这路的i 代表的是上面的j 执行类型自动做了转换
case i: Int => println("int类型" + i)
case s: String => println("string类型" + s)
case _ => println("其它类型" + j)
}
/**
* 匹配成功之后可以由返回值
*
*/
val k = 100
val r: Int = k % 2 match {
//匹配成功之后返回
case 1 => k + 1
case 0 => k * 2
}
var s = 0
if (k % 2 == 1) {
s = k + 1
} else {
s = k * 2
}
println(r)
println(s)
/**
* 模式匹配的应用
*
*/
val map = Map("001" -> "张三", "002" -> "李四")
val name: String = map.getOrElse("001", "默认值")
/**
* Option ; 由两个取值,Some None
* some代表有值
* None 代表没有值
*
*/
val option: Option[String] = map.get("003")
val value: String = option match {
//如果有值返回对应的值
case Some(v) => v
//如果没有值返回默认值
case None => "默认值"
}
val list: List[(String, Int)] = List(("001", 23), ("002", 24), ("003", 25))
list.map(kv => {
val id: String = kv._1
val age: Int = kv._2
(id, age + 1)
})
/**
* 使用case 代替lambda 表达式
*
* 需要将小括号替换成大括号
*/
val list1: List[(String, Int)] = list.map {
//匹配集合中的数据是否满足指定类型
case (id: String, age: Int) =>
(id, age + 1)
}
list1.foreach(println)
}
}