【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一、前述
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
模式匹配机制相当于java中的switch-case。
使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。
Actor相当于Java中的多线程。
二、具体阐述
trait特性
1、概念理解
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。
2、举例:trait中带属性带方法实现
- 继承的多个trait中如果有同名的方法和属性,必须要在类中使用“override”重新定义。
- trait中不可以传参。
- trait Read {
- val readType = "Read"
- val gender = "m"
- def read(name:String){
- println(name+" is reading")
- }
- }
- trait Listen {
- val listenType = "Listen"
- val gender = "m"
- def listen(name:String){
- println(name + " is listenning")
- }
- }
- class Person() extends Read with Listen{
- override val gender = "f"
- }
- object test {
- def main(args: Array[String]): Unit = {
- val person = new Person()
- person.read("zhangsan")
- person.listen("lisi")
- println(person.listenType)
- println(person.readType)
- println(person.gender)
- }
- }
3、举例:trait中带方法不实现
- object Lesson_Trait2 {
- def main(args: Array[String]): Unit = {
- val p1 = new Point(1,2)
- val p2 = new Point(1,3)
- println(p1.isEqule(p2))
- println(p1.isNotEqule(p2))
- }
- }
- trait Equle{
- def isEqule(x:Any) :Boolean
- def isNotEqule(x : Any) = {
- !isEqule(x)
- }
- }
- class Point(x:Int, y:Int) extends Equle {
- val xx = x
- val yy = y
- def isEqule(p:Any) = {
- p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
- }
- }
模式匹配match
1、概念理解:
Scala 提供了强大的模式匹配机制,应用也非常广泛。
一个模式匹配包含了一系列备选项,每个都开始于关键字 case。
每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
2、代码及注意点
- 模式匹配不仅可以匹配值还可以匹配类型
- 从上到下顺序匹配,如果匹配到则不再往下匹配
- 都匹配不上时,会匹配到case _ ,相当于default
- match 的最外面的”{ }”可以去掉看成一个语句
- object Lesson_Match {
- def main(args: Array[String]): Unit = {
- val tuple = Tuple6(1,2,3f,4,"abc",55d)
- val tupleIterator = tuple.productIterator
- while(tupleIterator.hasNext){
- matchTest(tupleIterator.next())
- }
- }
- /**
- * 注意点:
- * 1.模式匹配不仅可以匹配值,还可以匹配类型
- * 2.模式匹配中,如果匹配到对应的类型或值,就不再继续往下匹配
- * 3.模式匹配中,都匹配不上时,会匹配到 case _ ,相当于default
- */
- def matchTest(x:Any) ={
- x match {
- case x:Int=> println("type is Int")
- case 1 => println("result is 1")
- case 2 => println("result is 2")
- case 3=> println("result is 3")
- case 4 => println("result is 4")
- case x:String => println("type is String")
- // case x :Double => println("type is Double")
- case _ => println("no match")
- }
- }
- }
样例类(case classes)
1、概念理解
使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型时,它帮你实现setter和getter方法。
- 样例类默认帮你实现了toString,equals,copy和hashCode等方法。
- 样例类可以new, 也可以不用new
2、例子:结合模式匹配的代码
- case class Person1(name:String,age:Int)
- object Lesson_CaseClass {
- def main(args: Array[String]): Unit = {
- val p1 = new Person1("zhangsan",10)
- val p2 = Person1("lisi",20)
- val p3 = Person1("wangwu",30)
- val list = List(p1,p2,p3)
- list.foreach { x => {
- x match {
- case Person1("zhangsan",10) => println("zhangsan")
- case Person1("lisi",20) => println("lisi")
- case _ => println("no match")
- }
- } }
- }
- }
Actor Model
1、概念理解
Actor Model是用来编写并行计算或分布式系统的高层次抽象(类似java中的Thread)让程序员不必为多线程模式下共享锁而烦恼,被用在Erlang 语言上, 高可用性99.9999999 % 一年只有31ms 宕机Actors将状态和行为封装在一个轻量的进程/线程中,但是不和其他Actors分享状态,每个Actors有自己的世界观,当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-andforget),发送消息后不必等另外Actors回复,也不必暂停,每个Actors有自己的消息队列,进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统。
Actor的特征:
- ActorModel是消息传递模型,基本特征就是消息传递
- 消息发送是异步的,非阻塞的
- 消息一旦发送成功,不能修改
- Actor之间传递时,自己决定决定去检查消息,而不是一直等待,是异步非阻塞的
2、什么是Akka
Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和Scala 的 Actor 模型应用,底层实现就是Actor,Akka是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。
spark1.6版本之前,spark分布式节点之间的消息传递使用的就是Akka,底层也就是actor实现的。1.6之后使用的netty传输。
3、例:Actor简单例子发送接收消息
- import scala.actors.Actor
- class myActor extends Actor{
- def act(){
- while(true){
- receive {
- case x:String => println("save String ="+ x)
- case x:Int => println("save Int")
- case _ => println("save default")
- }
- }
- }
- }
- object Lesson_Actor {
- def main(args: Array[String]): Unit = {
- //创建actor的消息接收和传递
- val actor =new myActor()
- //启动
- actor.start()
- //发送消息写法
- actor ! "i love you !"
- }
- }
4、例:Actor与Actor之间通信
- case class Message(actor:Actor,msg:Any)
- class Actor1 extends Actor{
- def act(){
- while(true){
- receive{
- case msg :Message => {
- println("i sava msg! = "+ msg.msg)
- msg.actor!"i love you too !"
- }
- case msg :String => println(msg)
- case _ => println("default msg!")
- }
- }
- }
- }
- class Actor2(actor :Actor) extends Actor{
- actor ! Message(this,"i love you !")
- def act(){
- while(true){
- receive{
- case msg :String => {
- if(msg.equals("i love you too !")){
- println(msg)
- actor! "could we have a date !"
- }
- }
- case _ => println("default msg!")
- }
- }
- }
- }
- object Lesson_Actor2 {
- def main(args: Array[String]): Unit = {
- val actor1 = new Actor1()
- actor1.start()
- val actor2 = new Actor2(actor1)
- actor2.start()
- }
- }
附例:WordCount
- import org.apache.spark.SparkConf
- import org.apache.spark.SparkContext
- import org.apache.spark.rdd.RDD
- import org.apache.spark.rdd.RDD.rddToPairRDDFunctions
- object WordCount {
- def main(args: Array[String]): Unit = {
- val conf = new SparkConf()
- conf.setMaster("local").setAppName("WC")
- val sc = new SparkContext(conf)
- val lines :RDD[String] = sc.textFile("./words.txt")
- val word :RDD[String] = lines.flatMap{lines => {
- lines.split(" ")
- }}
- val pairs : RDD[(String,Int)] = word.map{ x => (x,1) }
- val result = pairs.reduceByKey{(a,b)=> {a+b}}
- result.sortBy(_._2,false).foreach(println)
- //简化写法
- lines.flatMap { _.split(" ")}.map { (_,1)}.reduceByKey(_+_).foreach(println)
- }
- }
【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型的更多相关文章
- Scala基础:模式匹配和样例类
模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...
- 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架
1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...
- 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)
3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...
- Scala模式匹配和样例类
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配 def mai ...
- 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, ...
- SQL SEVER 2008中的演示样例数据库
SQL SEVER 2008数据库是什么我就不说了,我在这里分享一下怎样学习SQL SEVER 2008数据库,假设是对数据库或是SQL SEVER 数据库全然陌生或是不熟悉的人来说,建议看看一些视频 ...
- Scala-Unit6-final/type关键字、样例类&样例对象
一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...
- Scala--模式匹配和样例类
模式匹配应用场景:switch语句,类型查询,析构,样例类 一.更好的switch val ch :Char = '+' val sign = ch match{ case '+' => 1 c ...
随机推荐
- iOS webview 获取html中的图片地址
//js代码,声明1个数组,对img 进行遍历,采用,分割多个url NSString * getAllImages = @"var str = new Array();" &qu ...
- tensorflow分类-【老鱼学tensorflow】
前面我们学习过回归问题,比如对于房价的预测,因为其预测值是个连续的值,因此属于回归问题. 但还有一类问题属于分类的问题,比如我们根据一张图片来辨别它是一只猫还是一只狗.某篇文章的内容是属于体育新闻还是 ...
- Tomcat配置https后,并发较大时,频繁超时情况。
tomcat配置ssl后,出现频繁的访问超时情况. 通过脚本(感谢UCloud的技术支持 金晓帆-): netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a i ...
- Solr的配置和在java中的使用
Solr是一个全局站内搜索引擎,可以快速的搜索出结果. Solr依赖于tomcat,把Solr的war包放到tomcat中即可运行. 使用solr,需要在solr的schema.xml中配置solr与 ...
- 服务器、IP地址和域名之间有什么关系?
一.服务器 服务器其实就像我们的家用电脑一样,也有主板.CPU.内存.硬盘.电源等,但是由于它们处理问题的不同,服务器更像一台加强的家用电脑,服务器是为展网络业务而存放.处理数据的,所以服务器一般是存 ...
- Emgucv使用中常用函数总结
Emgucv常用函数总结: 读取图片 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor); //根据路径创建指定的 ...
- 【ABP.Net】2.多数据库支持&&初始化数据库
abp默认连接的数据库是MSSQL,但是在开发过程中往往很多开发者不满足于mssql. 所以这里演示一下把mssql改成postgresql,来进行接下来的系统开发. abp的orm是用EF的.那么我 ...
- 通过游戏来学习CSS的Flex布局
在复习Flex 布局的时候发现的了几个有趣的小游戏,在这里分享并记录几个有难度的答案 1. Flexbox Froggy 通过调整CSS样式来使各种青蛙回到对应的荷叶上,游戏默认难度为Beginner ...
- vue中使用stylus
1.创建完成一个初始项目后,通过 npm install stylus -D命令,在项目内安装stylus.(注意:命令结尾 -D 即是 --save-dev 的简写形式) 2.需要安装loader, ...
- 洛谷p3800:Power收集
考虑朴素的dp: 对于每一行的每一个点 枚举能到的所有点(类似bzoj1648 比这题简单的dp) 期望时间复杂度O(NMT) 显然是超时做法 那么我们发现只有k个点对答案有贡献 考虑对每一个有权值的 ...