前言
大概介绍一下 scala中强大的模式匹配功能
最简单的例子
val bools = Seq(true,false) bools.foreach { case true => println("it's ture") case false => println("it's false") }
就是一个最简单的匹配。
类型匹配和值匹配
for { x <- Seq(1,2,3.1,"one","two",true) } { val s = x match { case 1 => "it's one" case _ :Int | _:Double => s"it's a number $x" case "one" => "it's one" case _:String => s"other string $x" case _ => s"unexpected value $x" } println(s) }
基本能说明问题了
seq匹配
val nonEmptySeq = Seq (1,2,5,6,8) val emptySeq = Seq.empty[Int] def seqToString[T](seq:Seq[T]):String = { seq match { case Nil => "Nil" case head +: tail => s"$head +: ${seqToString(tail)}" } } println(seqToString(nonEmptySeq)) println(seqToString(emptySeq))
其中的 +: 很有趣。 其实我们可以通过 1 :+ 2 :+3 :+ Nil 来构建一个 (1,2,3,Nil) 的序列。scala为了保证逆操作也可以通过 +: 来实现,所以特意写了一个单例
object +: { def unapply[T,Coll <: SeqLike[T, Coll]]( t: Coll with SeqLike[T, Coll]): Option[(T, Coll)] = if(t.isEmpty) None else Some(t.head -> t.tail) }
对于 unapply 后续再说,从上面的代码可以看出 :+ 其实就是一个单例。 在case 中做提取的时候,其实调用的是
case +:(head,tail) => s"$head +: ${seqToString(tail)}"
scala 通过中缀表达式,那么 就可以使用
case head +: tail => s"$head +: ${seqToString(tail)}"
顿时有一种大道至简的感觉。
case class 匹配
case class Address(street:String,city:String,coutry:String) case class Person(name:String,age:Int,address: Address) val alice = Person("alice",21,Address("1 street","beijing","china")) val bill = Person("bill",29,Address("2 street","hangzhou","china")) Seq(alice,bill).foreach{ case Person("alice",_ ,Address(_,city,_)) => println(s"hello alice .you are from $city") case Person("bill",_,_) => println("hello bill") case _ => println("who are you") }
直接看代码。 case class的匹配在 akka中用户非常大,可以让代码非常优雅。可以说就算从来没碰过scala人都知道这个匹配的意思。
unapply
class Person( val name:String,val age:Int) object Person { def apply(name: String, age: Int): Person = new Person(name, age) def unapply(person: Person): Option[(String, Int)] = Some((person.name,person.age)) } val person = Person("bill",29) person match { case Person(_,29) => println("you are 29") case _ => "who are you" }
对于scala来说,希望能支持构造(apply)和解构(unapply)的标准语法。之前提到的case class,其实大体的作用就是如上面所说,自动帮我们写了一个unapply的方法。对于的入参就是对象本身,出参是一个Option(scala2.11.1以后放松了限制,只需要返回的对象实现了isEmpty 和 get方法就ok). 其中apply 和 unapply互为逆操作。
正则表达式的匹配
val TtidRE = "(\\d+)@(.+)_(.+)_(\\d|.+)".r val ttid = "201200@taobao_iphone_2.1.0" ttid match { case TtidRE(channel,client,platform,version) => println(s"channel=$channel,client=$client,platform=$platform,version=$version") case _ => println("not match") }
如此优雅的代码!
相关推荐
它的语法与Java类似,但更加强调代码的表达性和简洁性,通过模式匹配、高阶函数等特性,使代码更加可读和易于维护。 1. 类型系统:Scala的类型系统非常强大,支持静态类型检查,同时也允许隐式转换和类型推断,这...
8. **模式匹配**:Scala的模式匹配不仅限于枚举类型,还可以用于解构类和集合,以及在case类和case对象上使用。这是一种强大的代码简化和错误检测工具。 9. **DSL(Domain Specific Language)**:Scala的语法特性...
此外,还会介绍Scala中的模式匹配,这是Scala语言的一大特色,使得代码更加简洁和高效。 第二部分:"Scala入门及进阶-part02-类和对象.pdf" 主要讲解Scala的面向对象特性。这部分内容会详细介绍类的创建、对象的...
- **函数式编程**:Scala同时也是一个成熟的函数式编程语言,支持高阶函数、模式匹配等功能。 - **类型推断**:Scala具有强大的类型推断机制,这使得开发者可以在很多情况下省略类型声明。 - **模式匹配**:提供了一...
- **模式匹配**:Scala支持强大的模式匹配功能,可用于字符串、类型以及复杂的数据结构。 - **样例类**:样例类是Scala中一种特殊的类,主要用于模式匹配。它们自动实现了许多有用的特性,如`equals`、`hashCode`和`...
1. **Scala基础**:首先,书籍可能会介绍Scala的基础语法,如类型系统、模式匹配、高阶函数和类、特质等,这些都是编写测试代码的基础。 2. **Scala测试框架**:Scala社区中有多个流行的测试框架,如ScalaTest、...
- **模式匹配**:Scala的模式匹配功能可以用于解构复杂数据结构,简化代码。 - ** Actors模型**:Scala内置了对Akka框架的支持,方便构建并发和分布式系统。 5. **Scala开发环境搭建**: - **Windows**:在...
Scala的模式匹配功能强大,允许你根据值的不同形态执行不同的操作。这种特性在处理数据结构和解析输入时非常有用。 5. **集合框架** Scala的集合库是其一大亮点,提供了丰富的数据结构,如List、Set、Map等,并且...
在学习过程中,理解Scala的类型推断和模式匹配也是关键。类型推断能让编译器自动确定变量的类型,提高代码的可读性和简洁性。模式匹配则是一种强大的工具,用于解构复杂数据结构并根据其结构执行不同的操作。 总的...
- **模式匹配**:使用 `case` 语句进行模式匹配,可以应用于多种场景,如解析数据结构、异常处理等。 - **隐式转换**:通过 `implicit` 关键字定义隐式转换规则,可以在编译时自动转换类型。 - **延迟初始化**:使用...
模式匹配是Scala的一个强大特性,可以用于解构复杂的数据结构,简化条件判断和数据处理。 6. 高级语法:Scala的语法非常灵活,包括元组、匿名函数、偏函数、case类等,这些都让代码更加简洁和富有表达力。 7. 并发...
与Java不同,Scala的类可以有默认构造器和主构造器,通过`case class`关键字可以创建模式匹配友好的类。 2. 函数是一等公民:Scala中,函数可以赋值给变量、作为参数传递、作为返回值,这使得函数式编程成为可能。 ...
此外,Scala还引入了模式匹配、高阶函数、类型推断等特性,提供了更高级的抽象工具。 Cats库是Scala中的一个关键部分,它提供了一套丰富的类型类,如Functor、Applicative、Monad等,这些类型类定义了常见的操作,...
- 模式匹配是Scala中的一个核心特性,它允许我们根据值的不同形式进行不同的操作,常用于解构复杂数据结构。 - 使用`case`关键字创建匹配模式,如`case class`实例、数组、集合等。 3. **函数与高阶函数**: - ...
模式匹配 函数式编程基础 函数式编程说明 函数定义/声明 函数运行机制 递归 函数注意事项和细节 过程 惰性函数和异常 面向对象编程初级 类和对象 包 包对象 面向对象编程中级 封装 继承 多态 面向对象...
7. **模式匹配**:Scala的模式匹配允许我们解构复杂数据结构,如case class,增强了代码的可读性和简洁性。 8. **元编程**:Scala的反射和类型系统允许在运行时检查和操作类型,以及创建动态代码,增加了编程的灵活...
学习这个课程,学员不仅可以了解Scala的基本语法和面向对象编程,还能接触到函数式编程的概念,如高阶函数、模式匹配和不可变数据结构。此外,由于Scala在大数据处理框架如Spark中的广泛应用,学员还将了解到如何...
总结,本Scala笔记Markdown版本涵盖了从语言基础到集合操作的重要内容,适合初学者入门和有经验的开发者巩固知识。通过学习,开发者将能够掌握Scala的核心特性和编程技巧,从而更好地利用Scala进行后端开发。
8. 模式匹配:用于处理数据结构,如case class和枚举。例如: ```scala sealed trait Color case object Red extends Color case object Green extends Color case object Blue extends Color val color = Red ...
Scala还引入了模式匹配,这是一种强大的控制流构造,可以用于解构复杂的数据结构。通过模式匹配,你可以根据数据的不同类型或结构执行不同的操作。在学习笔记中,这可能以简单的case语句形式出现。 另外,Scala中的...