Scala--模式匹配和样例类
模式匹配应用场景:switch语句,类型查询,析构,样例类
一、更好的switch
val ch :Char = '+' val sign =
ch match{
case '+' => 1
case '-' => -1
case _ => 0
} println(sign)
case _ 匹配其他情况,case 结尾不需要break跳出
二、守卫
val ch :Char = '9' var digit = 0 val sign =
ch match{
case '+' => 1
case '-' => -1
case _ => 0
case _ if Character.isDigit(ch) => digit = Character.digit(ch,10)
//case _ => 0
} println(sign,digit)
守卫可以是任何Boolean条件; 匹配是顺序下来的,上面的例子是匹配不到守卫的。
三、模式中的变量
case _ 看做是这个特性的一个特殊情况。
四、类型模式
var str =1 def f(s : Any) = s match{
case i : Int => println("int="+i)
case s : String=> println("str="+s)
case m : Map[String,Int]=> println("map="+m) //Map中的类型匹配是无效的
case _ => println("unknown")
} f(1)
f("Hello")
f(Map((1,2)))
结果:
int=1
str=Hello
map=Map(1 -> 2)
Map中的类型匹配是无效的,结果为
Map(1 -> 2)
匹配发生在运行期,Java虚拟机中的泛型信息是被擦掉的。
五、匹配数组、列表和元组
数组:
def f (str: Any) = str match{
case Array() => "0"
case Array(x,y) => x + " " + y
case Array(0, _*) => "0..."
case _ => "something else"
} println(f(Array(1,3)))
println(f(Array(0,1,3)))
1 3
0...
列表:
def fl (str: Any) = str match{
case 0::Nil => "0"
case x::y::Nil => x + " " + y
case 0::tail => "0..."
case _ => "something else"
} println(fl(List(0)))
println(fl(List(1,3)))
println(fl(List(0,1,3)))
0
1 3
0...
元组:
def ft (str: Any) = str match{
case (0,_) => "0"
case (x,y)=> x + " " + y
case (x,0,_) => "0..."
case _ => "something else"
} println(ft(Tuple2(0,1)))
println(ft(Tuple3(1,0,2)))
println(ft(Tuple4(1,0,2,3)))
0
0...
something else
六、提取器
模式匹配数组,元组,列表,这些背后是提取器机制。对象中有unapply或unapplySeq方法对值进行提取。
unapply方法用于提取固定数量的对象,unapplySeq提取的是一个序列。
七、变量声明中的模式
val (x,y)=(1,2)
Scala--模式匹配和样例类的更多相关文章
- Scala模式匹配和样例类
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配 def mai ...
- scala模式匹配与样例类
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...
- Scala基础:模式匹配和样例类
模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...
- 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)
3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...
- 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架
1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- Scala学习十四——模式匹配和样例类
一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...
- Scala集合库、模式匹配和样例类
package com.yz8 import org.junit.Test class test { @Test def test: Unit = { val ints = List(1,5,7,6, ...
- Scala-Unit6-final/type关键字、样例类&样例对象
一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...
随机推荐
- Javascript 对象 - 数组对象
JavaScript核心对象 数组对象Array 字符串对象String 日期对象Date 数学对象Math 数组对象 数组对象是用来在单一的变量名中存储一系列的值.数组是在编程语言中经常使用的一种数 ...
- $.ajax({})方法中的回调函数beforeSend,success,complete,error使用示例
在与后台交互的时候,经常使用到jquery的$.ajax()方法来请求数据.回调函数用的比较多的是success,但是beforeSend.complete.error函数也是很有用的.下面是使用例子 ...
- HBase最佳实践之Scan
一.简介 HBase中Scan从大的层面来看主要有三种常见用法:ScanAPI.TableScanMR以及SnapshotScanMR.三种用法的原理不尽相同,扫描效率当然相差甚远,最重要的是这几种用 ...
- java----自动类型转换
- Linux shell编写端口扫描脚本
Linux shell编写端口扫描脚本 需求: 扫描特定主机 扫描特定主机的特定端口 扫描特定网段 扫描特定网段中哪些主机开放了特定的端口 源码如下: #/bin/bash #该脚本用于对特定目标主机 ...
- js实现的省市联动
最近工作,要用到省市联动的功能.网上搜了一下,发现有很多这样的例子,看了不少实例,把觉得写得不错的代码穿上来,好给大家分享一下. <!DOCTYPE html PUBLIC "-//W ...
- ASP.NET -- WebForm -- 缓存Cache的使用
ASP.NET -- WebForm -- 缓存Cache的使用 把数据从数据库或文件中读取出来,放在内存中,后面的用户直接从内存中取数据,速度快.适用于经常被查询.但不经常变动的数据. 1. Te ...
- June 16. 2018, Week 24th. Saturday
Success is the ability to go from one failure to another with no loss of enthusiasm. 成功,就是即使经历过一个又一个 ...
- 查看linux系统是运行在物理机还是虚拟机方法
Windows:在CMD里输入:Systeminfo | findstr /i "System Model"如果System Model:后面含有Virutal就是虚拟机,其他都是 ...
- SQL INNER JOIN 关键字
SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行. INNER JOIN 关键字语法 SELECT column_name(s) FROM table ...