一、前述

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中不可以传参。
  1. trait Read {
  2. val readType = "Read"
  3. val gender = "m"
  4. def read(name:String){
  5. println(name+" is reading")
  6. }
  7. }
  8.  
  9. trait Listen {
  10. val listenType = "Listen"
  11. val gender = "m"
  12. def listen(name:String){
  13. println(name + " is listenning")
  14. }
  15. }
  16.  
  17. class Person() extends Read with Listen{
  18. override val gender = "f"
  19. }
  20.  
  21. object test {
  22. def main(args: Array[String]): Unit = {
  23. val person = new Person()
  24. person.read("zhangsan")
  25. person.listen("lisi")
  26. println(person.listenType)
  27. println(person.readType)
  28. println(person.gender)
  29.  
  30. }
  31. }

3、举例:trait中带方法不实现

  1. object Lesson_Trait2 {
  2. def main(args: Array[String]): Unit = {
  3. val p1 = new Point(1,2)
  4. val p2 = new Point(1,3)
  5. println(p1.isEqule(p2))
  6. println(p1.isNotEqule(p2))
  7. }
  8. }
  9.  
  10. trait Equle{
  11. def isEqule(x:Any) :Boolean
  12. def isNotEqule(x : Any) = {
  13. !isEqule(x)
  14. }
  15. }
  16.  
  17. class Point(x:Int, y:Int) extends Equle {
  18. val xx = x
  19. val yy = y
  20.  
  21. def isEqule(p:Any) = {
  22. p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
  23. }
  24.  
  25. }

 模式匹配match

1、概念理解:

Scala 提供了强大的模式匹配机制,应用也非常广泛。

一个模式匹配包含了一系列备选项,每个都开始于关键字 case。

每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。

2、代码及注意点

  • 模式匹配不仅可以匹配值还可以匹配类型
  • 从上到下顺序匹配,如果匹配到则不再往下匹配
  • 都匹配不上时,会匹配到case _ ,相当于default
  • match 的最外面的”{ }”可以去掉看成一个语句
  1. object Lesson_Match {
  2. def main(args: Array[String]): Unit = {
  3. val tuple = Tuple6(1,2,3f,4,"abc",55d)
  4. val tupleIterator = tuple.productIterator
  5. while(tupleIterator.hasNext){
  6. matchTest(tupleIterator.next())
  7. }
  8.  
  9. }
  10. /**
  11. * 注意点:
  12. * 1.模式匹配不仅可以匹配值,还可以匹配类型
  13. * 2.模式匹配中,如果匹配到对应的类型或值,就不再继续往下匹配
  14. * 3.模式匹配中,都匹配不上时,会匹配到 case _ ,相当于default
  15. */
  16. def matchTest(x:Any) ={
  17. x match {
  18. case x:Int=> println("type is Int")
  19. case 1 => println("result is 1")
  20. case 2 => println("result is 2")
  21. case 3=> println("result is 3")
  22. case 4 => println("result is 4")
  23. case x:String => println("type is String")
  24. // case x :Double => println("type is Double")
  25. case _ => println("no match")
  26. }
  27. }
  28.  
  29. }

 样例类(case classes)

1、概念理解

  使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型时,它帮你实现setter和getter方法。

  • 样例类默认帮你实现了toString,equals,copy和hashCode等方法。
  • 样例类可以new, 也可以不用new

2、例子:结合模式匹配的代码

  1. case class Person1(name:String,age:Int)
  2.  
  3. object Lesson_CaseClass {
  4. def main(args: Array[String]): Unit = {
  5. val p1 = new Person1("zhangsan",10)
  6. val p2 = Person1("lisi",20)
  7. val p3 = Person1("wangwu",30)
  8.  
  9. val list = List(p1,p2,p3)
  10. list.foreach { x => {
  11. x match {
  12. case Person1("zhangsan",10) => println("zhangsan")
  13. case Person1("lisi",20) => println("lisi")
  14. case _ => println("no match")
  15. }
  16. } }
  17.  
  18. }
  19. }

 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简单例子发送接收消息

  1. import scala.actors.Actor
  2.  
  3. class myActor extends Actor{
  4.  
  5. def act(){
  6. while(true){
  7. receive {
  8. case x:String => println("save String ="+ x)
  9. case x:Int => println("save Int")
  10. case _ => println("save default")
  11. }
  12. }
  13. }
  14. }
  15.  
  16. object Lesson_Actor {
  17. def main(args: Array[String]): Unit = {
  18.  
  19. //创建actor的消息接收和传递
  20. val actor =new myActor()
  21. //启动
  22. actor.start()
  23. //发送消息写法
  24. actor ! "i love you !"
  25.  
  26. }
  27. }

4、例:Actor与Actor之间通信

  1. case class Message(actor:Actor,msg:Any)
  2.  
  3. class Actor1 extends Actor{
  4. def act(){
  5. while(true){
  6. receive{
  7. case msg :Message => {
  8. println("i sava msg! = "+ msg.msg)
  9.  
  10. msg.actor!"i love you too !"
  11. }
  12. case msg :String => println(msg)
  13. case _ => println("default msg!")
  14. }
  15. }
  16. }
  17. }
  18.  
  19. class Actor2(actor :Actor) extends Actor{
  20. actor ! Message(this,"i love you !")
  21. def act(){
  22. while(true){
  23. receive{
  24. case msg :String => {
  25. if(msg.equals("i love you too !")){
  26. println(msg)
  27. actor! "could we have a date !"
  28. }
  29. }
  30. case _ => println("default msg!")
  31. }
  32. }
  33. }
  34. }
  35.  
  36. object Lesson_Actor2 {
  37. def main(args: Array[String]): Unit = {
  38. val actor1 = new Actor1()
  39. actor1.start()
  40. val actor2 = new Actor2(actor1)
  41. actor2.start()
  42. }
  43. }

 附例:WordCount

  1. import org.apache.spark.SparkConf
  2. import org.apache.spark.SparkContext
  3. import org.apache.spark.rdd.RDD
  4. import org.apache.spark.rdd.RDD.rddToPairRDDFunctions
  5.  
  6. object WordCount {
  7. def main(args: Array[String]): Unit = {
  8. val conf = new SparkConf()
  9. conf.setMaster("local").setAppName("WC")
  10. val sc = new SparkContext(conf)
  11. val lines :RDD[String] = sc.textFile("./words.txt")
  12. val word :RDD[String] = lines.flatMap{lines => {
  13. lines.split(" ")
  14. }}
  15. val pairs : RDD[(String,Int)] = word.map{ x => (x,1) }
  16. val result = pairs.reduceByKey{(a,b)=> {a+b}}
  17. result.sortBy(_._2,false).foreach(println)
  18.  
  19. //简化写法
  20. lines.flatMap { _.split(" ")}.map { (_,1)}.reduceByKey(_+_).foreach(println)
  21.  
  22. }
  23. }

【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型的更多相关文章

  1. Scala基础:模式匹配和样例类

    模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...

  2. 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架

    1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...

  3. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)

    3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...

  4. Scala模式匹配和样例类

    Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配     def mai ...

  5. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  6. Scala集合库、模式匹配和样例类

    package com.yz8 import org.junit.Test class test { @Test def test: Unit = { val ints = List(1,5,7,6, ...

  7. SQL SEVER 2008中的演示样例数据库

    SQL SEVER 2008数据库是什么我就不说了,我在这里分享一下怎样学习SQL SEVER 2008数据库,假设是对数据库或是SQL SEVER 数据库全然陌生或是不熟悉的人来说,建议看看一些视频 ...

  8. Scala-Unit6-final/type关键字、样例类&样例对象

    一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...

  9. Scala--模式匹配和样例类

    模式匹配应用场景:switch语句,类型查询,析构,样例类 一.更好的switch val ch :Char = '+' val sign = ch match{ case '+' => 1 c ...

随机推荐

  1. iOS webview 获取html中的图片地址

    //js代码,声明1个数组,对img 进行遍历,采用,分割多个url NSString * getAllImages = @"var str = new Array();" &qu ...

  2. tensorflow分类-【老鱼学tensorflow】

    前面我们学习过回归问题,比如对于房价的预测,因为其预测值是个连续的值,因此属于回归问题. 但还有一类问题属于分类的问题,比如我们根据一张图片来辨别它是一只猫还是一只狗.某篇文章的内容是属于体育新闻还是 ...

  3. Tomcat配置https后,并发较大时,频繁超时情况。

    tomcat配置ssl后,出现频繁的访问超时情况. 通过脚本(感谢UCloud的技术支持 金晓帆-): netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a i ...

  4. Solr的配置和在java中的使用

    Solr是一个全局站内搜索引擎,可以快速的搜索出结果. Solr依赖于tomcat,把Solr的war包放到tomcat中即可运行. 使用solr,需要在solr的schema.xml中配置solr与 ...

  5. 服务器、IP地址和域名之间有什么关系?

    一.服务器 服务器其实就像我们的家用电脑一样,也有主板.CPU.内存.硬盘.电源等,但是由于它们处理问题的不同,服务器更像一台加强的家用电脑,服务器是为展网络业务而存放.处理数据的,所以服务器一般是存 ...

  6. Emgucv使用中常用函数总结

    Emgucv常用函数总结: 读取图片 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor); //根据路径创建指定的 ...

  7. 【ABP.Net】2.多数据库支持&&初始化数据库

    abp默认连接的数据库是MSSQL,但是在开发过程中往往很多开发者不满足于mssql. 所以这里演示一下把mssql改成postgresql,来进行接下来的系统开发. abp的orm是用EF的.那么我 ...

  8. 通过游戏来学习CSS的Flex布局

    在复习Flex 布局的时候发现的了几个有趣的小游戏,在这里分享并记录几个有难度的答案 1. Flexbox Froggy 通过调整CSS样式来使各种青蛙回到对应的荷叶上,游戏默认难度为Beginner ...

  9. vue中使用stylus

    1.创建完成一个初始项目后,通过 npm install stylus -D命令,在项目内安装stylus.(注意:命令结尾 -D 即是 --save-dev 的简写形式) 2.需要安装loader, ...

  10. 洛谷p3800:Power收集

    考虑朴素的dp: 对于每一行的每一个点 枚举能到的所有点(类似bzoj1648 比这题简单的dp) 期望时间复杂度O(NMT) 显然是超时做法 那么我们发现只有k个点对答案有贡献 考虑对每一个有权值的 ...