美文网首页
46.Scala需要注意的点

46.Scala需要注意的点

作者: 文茶君 | 来源:发表于2020-03-05 21:35 被阅读0次

    我在45中写了Scala的相关信息,但是繁杂,这里将择重点讲述一下
    Scala是基于JVM的语言
    六大特点
    1.与java无缝整合
    2.类型推断
    3.支持分布式和并发Actor
    4.Trait特质特性
    5模式匹配match
    6.高阶函数
    类和对象:当new类时,类中除了方法不执行,其他都执行
    object相当于java的单例,定义的都是静态的
    class可以传参,传参就有了默认的构造
    重写构造时,第一行要先调用默认的构造
    方法和函数:1.方法定义 def 方法定义
    方法中传参要指定类型,方法自己可以推断返回类型,默认将方法体中最后一行计算得结果当做返回值返回
    如果要写return返回值,要显式的声明方法体的返回值
    如果方法体可以一行搞定,可以将方法体“{。。。。。。}”省略
    如果方法名称和方法体之间没有“=”,无论方法体返回什么值都回被丢弃,返回unit
    递归方法:显式写出返回值类型
    参数有默认值得方法 def fun(x:int=100)
    可变长参数的方法 def fun(x:int=100)
    匿名函数()=>{}
    可以赋值给一个变量,下次使用变量就是使用这个匿名函数
    偏应用函数
    嵌套方法
    高阶函数
    柯里化函数:高阶函数简化
    集合array arrraybuffer list
    map
    tuple
    var iter=tuple.prduceIterator
    trait相当于java中的接口和抽象类结合
    trait不可以传参
    类继承trait第一个关键字使用extends,之后使用with
    可以在trait中定义方法实现与不实现,变量和常量都可以
    模式匹配 match .....case
    模式匹配既可以匹配值,也可以匹配类型
    模式匹配中,从上往下匹配,匹配上了就自动终止
    模式匹配中会有值转换
    case_=>{....}什么都匹配不上最后匹配,要写到最后
    模式匹配match ....case相当于一大行,大括号可以省略
    样例类case class
    可以new也可以不new默认有setter,getter,对外可见
    偏函数PartialFunction[A,B] A是匹配的类型,B是匹配上返回的类型
    偏函数相当于java中的switch ...case...只能匹配相同类型

    1.scala object相当于java中的单例,object中定义的全是静态的。object不可以传参。对象要传参,使用apply方法
    2.Scala中定义变量使用var,定义常量使用val,常量不可变,变量可变.变量和常量类型可以省略不写,会自动推断。
    3.Scala中每行后面都会有分号自动推断机制,不用显式写出“;”
    4.建议在Scala中命名使用驼峰命名法
    5.Scala类中可以传参,有了参数就有了默认了构造。传参一定要指定类型。类中的属性默认有getter()和setter()。
    6.类中重写构造时,构造中首行必须先调用默认的构造
    def this(){
    this()
    ....
    }
    7.scala中当new class时,类中除了方法不执行(除了构造方法),其他都执行
    8.在同一个Scala文件中,class名称和object名称一样时,这个类叫做这个对象的伴生类,这个对象叫做这个类的伴生对象,他们之间可以互相访问私有对象

    Scala简单语法

    1.if else和java一样
    if()
    {}
    else
    {}
    2.for

    object Test {
    def main(args: Array[String]) {
    var a = 0;
    // for 循环
    for( a <- 1 to 10){
    println( "Value of a: " + a );
    }
    }
    }
    这里注意<要和-连着
    结果:
    value of a: 1
    value of a: 2
    value of a: 3
    value of a: 4
    value of a: 5
    value of a: 6
    value of a: 7
    value of a: 8
    value of a: 9
    value of a: 10

    注意var r1=1 until 10这里是指1到9,不包含10
    var r=1.to(10,2)表示1,3,5,7,9

    3.方法

    方法定义
    1.方法体中最后返回值可以使用return,如果使用了return,那么方法体的返回值类型一定要指定
    2.如果方法体中没有return,默认将方法体中最后一行计算的结果当做返回值返回。方法体的返回值可以省略,会自动推断
    3.定义方法传入的参数一定要指定类型
    4.方法的方法体如果可以一行搞定,那么方法体的“{}”可以省略
    5.如果定义方法时,省略了方法名称和方法体之间的“=”,那么无论方法体最后一行计算的结果是什么,都会被丢弃,返回Unit
    6.def定义方法
    def(方法开头) max (方法名)(x:Int,y:Int)(参数):Int(返回值类型)={
    if(x>y)
    x
    else
    y
    }
    7.递归方法
    递归方法要显式的声明函数的返回
    8.参数有默认值的方法
    9.可变长参数的方法
    参数后加个*就可以
    10.匿名函数
    "=>"就是匿名函数,多用于方法的参数是函数时,常用匿名函数
    (a:Int,b:Int)=>{
    a+b
    }
    11嵌套方法
    12.偏应用函数
    某些情况下,方法中参数非常多,调用这个方法非常频繁,每次调用只有固定的某个参数变化,其他都不变,可以定义偏应用函数
    13.高阶函数
    1)方法参数是函数
    2)方法的返回是函数<要显式的写出方法的返回值类型,加_就可以不显示的声明方法的返回值>
    3)方法的参数和返回都是函数



    13柯里化函数


    4.字符串和集合

    1.不可变
    var arr1=new Array[Int](3)
    二维数组
    var array=new Array[Array[Int]](3)
    array.concat
    合并两个数组
    array.fill(5)("hello")
    代表创建一个初始化长度为5,初始化值为hello的数组
    2可变
    val arr=new ArrayBuffeer
    3.list
    var list=List()
    不需要加new
    list.map( )
    list.flatMap()


    list.filter()过滤
    4.set
    val set=Set[Int]()
    set.intersect()取交集
    set.diff()取差集
    5.map
    val map=Map[String,Int]
    6.tuple元组
    元组最多支持有22个元素
    元祖可以new也可以不new,甚至可以直接在()写元素
    tuple.swap
    7.Trait
    Scala trait(特征)相当于java的接口,实际上它比接口还功能强大。详细请看45
    一个类继承多个trait时,第一个关键字使用extends,之后使用with
    trait不可以传参
    trait中可以有方法体的实现或者方法体的不实现,类继承了trait要实现trait中没有实现的方法
    8.模式匹配match
    1.case_默认什么都匹配不上,放在最后
    2.match可以匹配值,还可以匹配类型
    3.匹配过程中会有数值的转换
    4.从上往下匹配,匹配上会自动停
    5.模式匹配外部的“{...}”可以省略

    9.偏函数
    只能匹配一个值,匹配上了放回某个值
    PartialFunction[A,B] A是匹配的类型,B是匹配上返回的类型
    10.样例类
    用关键字case修饰的类
    默认实现了setter和getter,tostring这些方法

    5.隐式转换

    隐式值是指在定义参数时前面加上implicit。隐式参数是指在定义方法时,方法中的部分参数是由implicit修饰【必须使用柯里化的方式,将隐式参数写在后面的括号中】。隐式转换作用就是:当调用方法时,不必手动传入方法中的隐式参数,Scala会自动在作用域范围内寻找隐式值自动传入。


    Actor Model

    Actor Model是用来编写并行计算或分布式系统的高层次抽象(类似java中的Thread)让程序员不必为多线程模式下共享锁而烦恼,被用在Erlang 语言上, 高可用性99.9999999 % 一年只有31ms 宕机Actors将状态和行为封装在一个轻量的进程/线程中,但是不和其他Actors分享状态,每个Actors有自己的世界观,当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-andforget),发送消息后不必等另外Actors回复,也不必暂停,每个Actors有自己的消息队列,进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统。
    Actor的特征:
    ActorModel是消息传递模型,基本特征就是消息传递
    消息发送是异步的,非阻塞的
    消息一旦发送成功,不能修改
    Actor之间传递时,自己决定决定去检查消息,而不是一直等待,是异步非阻塞的
    什么是Akka
    Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和Scala 的 Actor 模型应用,底层实现就是Actor,Akka是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。
    spark1.6版本之前,spark分布式节点之间的消息传递使用的就是Akka,底层也就是actor实现的。1.6之后使用的netty传输。

    相关文章

      网友评论

          本文标题:46.Scala需要注意的点

          本文链接:https://www.haomeiwen.com/subject/pkvikhtx.html