scala学习

Scala语言的核心知识,包括scala语言的基础、数据结构高阶特性等。

  1. scala换行符可省略;scala 的main在object中;scala文件名可以不予对象名匹配但是建议匹配。
  2. scala中有8种类型:Byte/Short/Int/Long/Float/Double/Char/Boolean。这些都是类。
  3. 对应的RichInt或者RichChar。
  4. 1.max(10);1.min(10);1.to(10);1.until(10)。"11".toInt;
  5. Any是所有类的超类,AnyVal是所有值类的父类,AnyRef是所有引用的父类。Null是所有引用类的子类,只有一个实例null。Nothing是所有类的子类。Unit是标识过程,Unit类似void。
  6. val和var:必要指明类型。val常量。
  7. scala没有++/--只有+= 、-=。
    1. 块表达式 和赋值:{}包含系列表达式,结果也是一个表达式,块中最后一个表达式就是块的值。
    2. 赋值语句返回Unit就是没有值。
  8. readLine/readint/readDouble/readShort;print/println/printf。
  9. 字符串插值器:S/F/ROW。$符号进行变量引用:s"hello,$subject";F插值器:用%来进行引用变量。F包含S。ROW原样输出。
  10. 对象相等:比较相等可以直接使用==(包括引用和非引用)。
  11. if-else:有返回值,将最后一行语句作为返回值。if(num>20) "aasd" else 1213;直接将if - else 语句赋值给一个变量,val name = if () "" else "";返回值类型是值的公共类。如果没有else语句块,那么默认的else的值就是Unit(可以用小括号表示)。
  12. for循环:for(i <- 1 to 10) {println(S"i=$i ")}; until --单边闭合。for(i <- 1to3; j<- 1 to 5)--双重for循环,用;号隔开。for(i <- 1 to 10;j <- 1 to 10 if i==j){};增加if语句,后面是条件满足则执行循环体。推导式:yield-- for() yield i%2;接受收集for的所有结果并返回给一个变量。for(i <- 1 to 9; j<- 1to 10)。for{  }形式中换行表示条件。for(ele <- " asdas")。
  13. while循环:scala提供了与java类似的while,while没有返回类型。scala去掉了break和continue。那么可以通过改变while执行条件来终止循环。----使用return关键字来终止循环:单独的return。----使用breakable和break:导入:scala.util.control.Breaks包:单独的break()。 
  14. 函数:函数中的最后一句为返回则无需return,最好明确声明函数的返回值。需指明参数类型。def () : Unit = {};没有返回值,Unit类型可以省略=号,这种函数称为过程。默认参数:可以直接赋值在类型后。变长参数在类型后面加*号,且只能有一个符号。
  15. 懒值:val被前缀lazy初始化被推迟至初次使用该变量。

  16. 文件操作:导入scala.io.Source,引入Source中的方法读取。Source.fromFile(...);没有对文件写入的支持,可使用java.io.PrintWriter,writer.println()来实现。

  17. 数组及元组:定长数组和变长数组。val nums = new Array[Int](10);nums(9) = 10; 整型初始值为0;val arrays = Array(1,2,3); val numsTest = (1 to 100).toArray; 

  18. 导入包:scala.collection.mutable.ArrayBuffer。同样有append、insert、remove等。toArray和toBuffer进行变长和定长的转换。支持增强for循环遍历数组:for(elem<- nums)。

  19. 数组算法:类似于属性值。arr.sum/arr.max/arr.min/arr.sorted/distinct/length,等等。drop--dropRight,slice(n,m)--切片左闭合。mkString("", "", "")进行数组的连接。用于数组的操作符(:++:++) :+是在尾部增加,+:是在头部追加,++用于连接2个集合。zipWithIndex使用索引号进行填充。

  20. Array.ofDim[Int](n,m)---多行数组;

  21. Tuple的上限是22。不同类型的值的集合。元组从1开始遍历,_1。foreach(进行遍历)

类与对象:

  1. scala中无需声明public。private关键字是仅限于类的内部访问。
  2. 自定义getter和setter:Bean。
  3. scala中主构造器和类名混在一起:每个辅助构造器:this()必须以其他的构造器调用作为第一句。
  4. 单例对象:创建单例对象不需要使用new关键字,object中只有无参构造器,主构造代码块只执行一次。
  5. 当单例对象和某个类具有相同的名字称其为该类的伴生对象。
  6. 采用extends App可以实现不写main方法执行对象。
  7. apply方法定义在伴生对象中,隐式实现object中的伴生类构造器(不用使用new关键字)。
  8. trait特质特性;

模式匹配:

  1. 类似于switch case:变量类型、集合元素、有无值等;无需break语句即可停止匹配。
  2. 变量 match { case 值 => 代码 }
  3. case _ => println ( " 都没有匹配上,我是默认值 " )。
  4. 守卫式匹配:case中增加if语句再=>;
  5. 匹配类型:case 变量 : 类型 => 代码或返回值当变量是case中的类型的时候而不是case中的值。
  6. 匹配数组元组、集合:case Array(0, x, y) => println(x + " " + y);case Array(1, _*) => println("1 ...");
  7. list的匹配在case后的所有内容均为待匹配内容。
  8. case class:是scala中的特殊的类称为样例类。可以用来进行模式类型匹配。
  9. scala中option选项用来表示一个值是可选的,有值或者无值。Option通常与模式匹配结合使用,用于判断某个变量是有值还是无值。 Map("jacky" -> 90, "tom" -> 80, "jarry" -> 95) ;  val grade = grades.get(name);grade有值:case Some(grade) => println("成绩:" + grade) 。无值:case None => println("没有此人成绩!")

函数及抽象化:

  1. 函数式编程,函数可以作为参数被传递和操作。val adder2 = (x: Int, y: Int) => x+y。
  2. 方法不能作为单独的表达式存在,函数必须有参数列表,方法名是方法调用,函数名只是代表函数对象本身。
  3. 一般情况下 ,不对二者做区分,认为都是函数, 更多的时候使用 def 定义函数。
匿名函数:
  1. 匿名函数,又被称为 Lambda 表达式。没有名字。
  2. ( 参数名 1: 类型 1, 参数名 2: 类型 2, ... ...) => 函数体;
    只有一个参数,小括号可以省略
  3. 高阶函数:接受函数或者返回函数(代码块最后一个);常用的高阶函数:map、reduceflatMapforeachfiltercount … … (接收函数作为参数);    (1 to 5).map(func(_)).foreach(println);
  4. 闭包是一种函数,一种比较特殊的函数。
  5. 闭包: 闭包是一种函数,一种比较特殊的函数,它和普通的函数有很大区别。也可理解为 把函数外部的一个自由变量关闭进来 。就是去捕获外部变量的过程。
  6. 函数编程中,接收多个参数的函数都可以转化为接收单个参数的函数,这个转化过程就叫柯里化。柯里化函数的定义形式和普通函数类似,区别在于柯里化函数拥有多组参数列表,每组参数用小括号括起来。
  7. 部分应用函数:部分应用函数是 指缺少部分(甚至全部)参数的函数 。类似于将原函数参数列表中的形参化为实际值,部分参数仍旧不变。  def add ( x : Int , y : Int , z : Int ) = x + y + z ;   --  def addX = add ( 1 , _ : Int , _ : Int );
  8. 偏函数: 在偏函数中只能使用 case 语句 ,整个函数必须用 大括号包围。 Scala 中的 Partial Function 是一个 trait ,其类型为 PartialFunction[A,B] ,表示:接收一个类型为 A 的参 数,返回一个类型为B 的结果。并不需要对所有函数输入做响应。只能使用case语句构成。
集合:
  1. 集合的三大类:SeqSetMap
  2. 可变不可变、有序或无序。所有的集合类都有可变不可变版本。
  3. 所有的集合都扩展自 Iterable特质im 。Scala 集合有三大类: Seq(序列)、Set(集)、Map(映射) 均有对应的可变以及不可变类型。
隐式转换:
  1.  利用隐式转换和隐式参数,可以提供类库,对类库的使用者隐匿掉具体的细节。
  2. 在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回,这就是“ 隐式转换 Scala 自动传入隐式转换函数 ,并 完成对象的类型转换 在object中使用implicit关键字定义隐式转换函数。
  3. 隐式函数的定义必须定义在使用之前,否则编译报错。 将Int2StringTest内部的成员导入到相应的作用域内,否则无法调用隐式函数。 隐式转换 无需亲自调用,由后台自动完成。
  4. 在调用该函数的时候,可以不用传递隐式参数,而编译器会自动寻找一个 implicit 标记过的合适的值作为参数。
  5. 函数定义的时候,支持在 最后一组参数 中使用 implicit ,表明这是一组隐式参数。
  6. 泛型类:在类的声明中定义一些泛型类型,然后在类内部的字段或者方法中可以使用这些类型。泛型函数: 定义中存在泛型的使用 def getCard [ T ]( content : T ) ;
  7. AKKOSystem;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端成神之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值