1、scala

  ①定义:Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。

  ②特点:优雅、简洁、一行代码抵得上多行Java代码

2、变量和常量、懒值

   var r = 1
r = 2;
r = 'A'      //这是有问题的,var定义的r是int var rStr: String = "1"      //可以在定义的时候指定类型
var a,b = 1     //定义多个变量 val c = 2       //常量

   注 :val就不能再赋值了。与之对应的,var可以在它生命周期中被多次赋值

   注:官方推荐val 使用val的好处:

    1、更安全         2、代码可读性更高        3、资源回收更快,方法执行完,val所定义的变量即回收

  注:只有val修饰的变量才能被lazy修饰;使用lazy定义变量后,只有在调用该变量时才会实例化这个变量的值。而且惰性变量只能是不可变变量;

3、包装类(富包装器)

    原型       包装类          高级包装       java包装

    byte       Byte         RichByte       Byte

    short        Short          RichShort        Short

    int          Int            RichInt        Integer

    long       Long           RichLong        Long

    char        Char         RichChar       Character

    float        Float         RichFloat        Float

    double       Double          RichDouble       Double

    boolean       Boolean        RichBoolean       Boolean

              BigInt                     BigInteger    //存储大的整数

              BigDecimal                  BigDecimal   //存储位数比较多的小数

      使用实例:

     val valchar: char = 'a'
val valFloat: Float = 1.1F
val valRichLong: RichLong = 1L

  注:包装类是为了使基本类型转变为类。而高级包装(富包装器)则是在包装类的基础上扩展了很多其他的方法。

4、继承

     

  Any则是AnyVal, AnyRef的父类。也就是说,Any是所有Scala类型的父类,它内置于Scala内部,由编译器实现。

  AnyRef是所有「引用类型」的父(根)类

  AnyVal是所有「值类型」的父(根)类

  Null类型为所有引用类型的子类,其拥有唯一的实例:null。

  Nothing:它是所有类的子类。

5、返回值(Unit、Option)

  Unit类型是一个特殊的值类型,它等价于Java中的void。

  Option:返回some类型具或NONE,由于有这个特性,在返回值中经常用,防止出现异常

  val arr = Array[Int](1,2)
  val value1: Option[String] = arr(1)
  val value2: Option[String] = arr(3)       println(value1) // Some("value1")
  println(value2) // None

6、表达式

  表达式:一个具有执行结果的代码块,分为条件表达式、块表达式

  val y = if (x > 0 ) 1 else -1        //条件表达式

  val res = {                       //块表达式
if (x < 0) {
-1
} else {
"error"
}
  }

7、循环

    ①to、until

        println(1 to 10 )                  //1-10
println(1 until 10 ) //1-9,不打印最后一个数 ②基础循环 for( i <- 1 to 10 ){
println(i)
} ③多层循环 for(i <- 1 to 10; j <- 1 until 10){
println("i="+ i +", j="+j) //当i=1,j循环1-9;当i=2,j循环1-9
} ④加条件循环 for(i<- 1 to 10 ;if (i%2) == 0 ;if (i == 4) ){
println(i) //4,当满足是偶数且i==4才输出
} ⑤yield for( i <- 1 to 10 ) yield{
i * 2     //返回乘以2以后的集合
} ⑥跳出循环 import util.control.Breaks._ breakable(
for(i<-0 until 10) {
if(i==5){
break()     //如果i == 5,就终止breakable包裹的这一堆,此时类似于break
}
println(i)
}
) for(i<-0 until 10) {
breakable{
if(i==5){
break()    //如果i == 5,就终止breakable包裹的这一堆,此时类似于continue
}
println(i)
}
}

8、函数

    ①简单函数定义

        def fun (a: Int , b: Int ) : Unit = {
println(a+b)
} ②递归函数 def fun(num :Int) :Int= {
if(num ==1)
num
else
num * fun2(num-1)
}
print(fun(5)) //求5的阶乘 ③带默认值的函数 def fun(a :Int = 10,b:Int) = {
println(a+b)
}
fun(b=2) ④可变参数的函数 def fun(elements :Int*)={
var sum = 0;
for(elem <- elements){
sum += elem
}
sum
}
println(fun(1,2,3,4)) ⑤匿名函数 val value2 = ()=>{
println(" ") //无参数匿名函数
} val value3 = (a:Int,b:Int) =>{
a+b //有参数的匿名函数
} ⑥偏应用函数 def log(date :Date, s :String)= {
println("date is "+ date +",log is "+ s)
} val date = new Date() val logWithDate = log(date,_:String) logWithDate("log11") //注:偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。 ⑦生产函数 def mulBy(factor : Double) = (x : Double) => factor * x val quintuple = mulBy(5) //quintuple=(x : Double) => 5* x quintuple(20) // 100 //注:mulBy输入的是一个double类型,返回的是一个匿名函数 ⑧函数柯里化 //将一个函数变为两个函数的顺序调用。比如1+3+4 ,可以分为(1 + 3)+ 4 两个函数 def add(x:Int,y:Int)=x+y <==> def add(x:Int)(y:Int) = x + y //调用:add(1,2)、add(1)(2)

  注:方法和函数的区别

    ①Scala中使用val语句可以定义函数,def语句定义方法

    ②函数可作为一个参数传入到方法中,而方法不行

    ③方法转函数:val f1 = m _  

9、高阶函数

   定义:以函数作为参数或者返回值的函数

    ①函数作为值

        声明:
val f: (String, Int) => Char = _ . charAt (_)
调用:
f("lihaozong",5); ②函数作为参数 声明:
def P(f : (Double) =>Double) = f(0 . 25)
调用:
P( ceil._ ) // 1 . 0 注:函数P的参数是一个函数f(输入、输出都是double),返回值函数f输入为0.25时的输出

10、对象、单例对象、伴生对象 

  单例对象:scala类的一个实例,使用class创建,但是在单例对象中没有静态方法和静态字段

  伴生对象:在Scala的类中,与单例对象类名相同并且用object修饰的对象叫做伴生对象

      ①apply:当object进行初始化时、集合中取值时候(array(5)、list(1,2,3).foreach等)都要用到

      ②unapply(提取器):经常用在模式匹配或者偏函数中

  注:伴生对象类似于java中的工具类,里面封装的静态成员

11、IO

    import scala.io.Source
val source = Source.fromFile("1.txt", "UTF-8")
for (line <- source.getLines) print(line)

12、闭包 

  定义:函数引用外部变量叫闭包。之所以要单独提出来,因为在分布式计算中,main方法中定义的全局变量,main中的方法不能直接使用Spark的Task调度器会把方法传给Excutor,但不能传递变量。这也是定义广播变量的原因

13、泛型

  基础的泛型,此处不讲,主要讲的是比java中多出来的概念。

    协变:对类型A和B,A是B的子类型,那么List[A]是List[B]的子类型

        def A(animals: List[Animal]): Unit = {....}

        val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))

        A(cats)                        //根据协变List(Cat("Whiskers"), Cat("Tom")为 List[Animal]子类,可以调用

    上界:  T <: A ,表示类型变量 T 必须是 类型 A 子类

        class PetContainer[P <: Pet](p: P) {....}            //输入参数p的类型P必须是类型Pet的子类

    下界: B >: A 表示参数类型或抽象类型  B 须是类型A的父类

        def prepend[U >: B](elem: U): Unit ={...}

    上下文界定:T : M, 其中M 必须为泛型类, 必须存在一个M[T]的隐式值

        class Pair_Context[T : Ordering](val first: T, val second: T){
def smaller(implicit ord: Ordering[T]) =
if(ord.compare(first, second) < 0) first else second
}

1-scala基础的更多相关文章

  1. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  2. Scala学习(一)--Scala基础学习

    Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...

  3. Scala基础(1)

    Scala基础语法 声明与定义: val,常量声明                       val  x:T(把x声明成一个类型为T的常量)  x是变量的名字,T是变量的类型          v ...

  4. scala 基础知识总结

    在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...

  5. 1.scala基础语法总结

    Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...

  6. Scala 基础(8)—— 占位符_和部分应用函数

    1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...

  7. Scala 基础(7)—— 函数字面量和一等函数

    1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...

  8. Scala 基础(5)—— 构建函数式对象

    有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...

  9. Scala基础知识[一]

    摘要:在Scala 是 Scalable Language 的简写,是一门多范式(multi-paradigm)的编程语言.设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Jav ...

  10. Scala基础简述

    * Scala基础简述 本文章作为Scala快速学习的教程,前提环境是:我假设在此之前,你已经学会了Java编程语言,并且我们以随学随用为目标(在此不会深度挖掘探讨Scala更高级层次的知识).其中语 ...

随机推荐

  1. 1、Nginx集群tomcat

    一.准备工作 下载nginx,http://nginx.org/,本文采用nginx-1.8.0,下载之后直接解压,免安装 下载tomcat,以配置3台tomcat服务器做负载均衡为例 二.修改tom ...

  2. Maven下载项目依赖jar包和使用方法

    一.Maven3.5.0安装与配置+Eclipse应用 参考:Maven3.5.0安装与配置+Eclipse应用 二.http://mvnrepository.com/ 此处以http://mvnre ...

  3. sql日期操作

    日期格式化函数 ), ): :57AM ), ): ), ): ), ): ), ): ), ): ), ): ), ): , ), ): :: ), ): :::827AM ), ): ), ): ...

  4. delphi 关于 "高位" 与 "低位"

    Longint = Integer WPARAM = Integer LPARAM = Integer LRESULT = Integer FARPROC = Pointer function Mak ...

  5. HTML和CSS的静态页面

    链接:https://pan.baidu.com/s/1fGajigyQJDLIHqxJn2LXsQ 提取码:7sry 复制这段内容后打开百度网盘手机App,操作更方便哦 设计思路,把网页分成几个模块 ...

  6. Java第09次实验(IO流)

    参考资料 本次作业参考文件 正则表达式参考资料 第1次实验 0. 验证 使用FileOutputStream写字节.(二进制文件与文本文件.try...catch...finally注意事项) 使用D ...

  7. 基于单片机的Wifi温度湿度测量仪

    这次的制作背景是由于单片机课程实训课程要求 刚好手上有块ESP8266-12F的WiFi模块 于是就选择了制作一个基于单片机,使用WiFi传输数据的温湿度采集测量仪 制作过程: 由于有使用过WiFi模 ...

  8. vue-router总结

    之前写过一篇关于vue-router的文章,主要是介绍怎么结合cli2在项目中使用vue-router,比较的简单,今天想结合cli3来总结一下vue-router的具体用法. cli3 在介绍vue ...

  9. 科学-天文学-天文观测站:TMT(红外天文望远镜)

    ylbtech-科学-天文学-天文观测站:TMT(红外天文望远镜) 30米望远镜(Thirty Meter Telescope,TMT) 系由美国加州大学和加州理工学院负责研制的新一代地基巨型光学-红 ...

  10. [UE4]使用材质将图片变成黑白

    拖动到材质界面不放,会自动切换到材质界面: 拖放到视图窗口,放开鼠标,就会自动生成一个“Texture Sample”节点 图片材质使用方法跟直接使用图片素材一样: