Scala极速入门

  1. 定义

  2. Scala语言是一种面向对象语言,同时又结合了命令式(imperative)和函数式(functional)编程风格。官网描述:Object-Oriented Meets Functional(面向对象遇到函数式编程)。

  3. 安装

  4. 下载地址http://www.scala-lang.org/download/

  5. 当前版本2.11.4

  6. 设置环境变量


  7. export SCALA_HOME=/home/mupeng/Hadoop/scala-2.11.4
  8. export PATH=$SCALA_HOME/bin:$PATH
  9. 如果是修改的profile,执行source /etc/profile,使环境变量立即生效。

  10. 检测安装是否成功命令 scala -version,如果出现以下内容,证明安装成功。


  11. scala -version
  12. Scala code runner version 2.11.4 -- Copyright 2002-2013, LAMP/EPFL
  13. Scala解释器

  14. 直接输入scala,就进入scala解释器


  15. scala
  16. Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
  17. Type in expressions to have them evaluated.
  18. Type :help for more information.
  19. 先来两个例子,熟悉以下scala解释器

  20. ?
  21. 1
  22. 2
  23. scala> 1+2
  24. res0: Int = 3
  25. 结果被命名为res0,Int指结果类型,3指计算结果


  26. scala> println("hello scala")
  27. hello scala
  28. 输出hello scala

  29. 变量

  30. Scala中的变量有两种var和val(val类似于Java中final,值不可改变)

  31. scala> var hello = "hello world"

  32. hello: String = hello world

  33. scala可以根据赋值内容推算出变量类型。Scala中的数据类型都是对象。

  34. 函数

  35. Scala是面向对象语言同时也是函数式编程语言,因此函数在Scala语言中的地位同对象、变量一样。使用scala函数注意一下几点:

  36. 1) 函数参数写在类型之前,中间用逗号隔开;


  37. def helloScala = {
  38.     println("Hello Scala!")
  39. }
  40. 2) 函数都有返回结果,无需使用return,函数内最后一个表达式作为返回结果返回。helloScala函数的返回类型为Unit,表示该函数不返回任何有意义的值(相当于Java中的void)。

  41. 3) 函数参数可以给定默认值。

  42. ?
  43. 1
  44. 2
  45. 3
  46. def hello(name : String = "Scala") : String = {
  47.     return "Hello : " + name
  48. }
  49. 4) 函数的参数都是val类型,执行过程中不能被改变。(函数式编程的特点,只计算结果,不改变参数)

  50. 5) 定义方法还有如下方式

  51. def add = (x : Int, y : Int) => x + y

  52. 打印结果print(add(1, 2));  

  53. def add2(x : Int)(y : Int) = x + y

  54. 打印结果print(add2(1)(2))

  55. 循环

  56. 在了解循环之前,我们先要知道Scala不支持i++和++i,需要使用i+=1来实现加一。

  57. while循环


  58. var i=0
  59. while (i < args.length) {
  60.   println (args(i))
  61.   i+=1
  62. }
  63. for循环


  64. for (arg <-args)
  65.   println(arg)
  66. for参数里面同样支持if判断,比如输出1——10中的偶数

  67. for (i <- 1 to 10 if i % 2 == 0) 
  68.   println(i)
  69. foreach

  70. ?
  71. 1
  72. args.foreach(arg => println(arg))
  73. 因为参数只有一个,表达式也只有一个,可以简写为


  74. args.foreach(println)
  75. Array与List

  76. 创建数组有两种方式


  77. val greetStrings = new Array[String](3) 
  78. greetStrings(0) = "Hello" 
  79. greetStrings(1) = ", " 
  80. greetStrings(2) = "world!\n"
  81. 或者

  82. val numNames = Array("zero", "one", "two")
  83. 注意与Java不同的是:数组的第零个元素是greetStrings(0),不是greetStrings[0]。

  84. Array长度不可变,但是它的值可变。

  85. List长度与值都不可变。


  86. val list1 = List(1, 2)
  87. val list2 = List(3, 4)
  88. val list3 = list1 ::: list2  //list3结果为(1,2,3,4)
  89. val list4 = 0 :: list3       //list4结果为(0,1,2,3,4)
  90. 这里有两个操作 ::: 连接两个List

  91. :: 右操作符,将一个新元素放到List的最前端。

  92. 类与对象

  93. 1. 定义类


  94. class Person {
  95.   var email = "abc123@126.com" // 变量,var声明会生成getter和setter方法
  96.   var name : String = _ // 变量, _起到占位符的作用
  97.   val age = 10;         // 常变量,val声明只会生成getter
  98.   private val gender = "male" //只能在类内部使用
  99. }
  100. 缺省访问级别是public,一个源文件中可以有多个class,都是public的。

  101. 2. 主构造器


  102. class Student(var name : String, val number : String) {
  103.   println("主构造器!")
  104. }
  105. 1)主构造器直接跟在类名后面,主构造器的参数最后会被编译成字段。
  106. 2)主构造器执行的时候,会执行类中所有的语句。

  107. 3)如果主构造器参数声明时候不加val或者var,就相当于private
  108. 3. 从构造器

  109. class Student(var name : String, val number : String) {
  110.   println("主构造器!")
  111.   var gender : String = _
  112.   def this(name : String, number : String, gender : String) {
  113.     this(name, number)
  114.     this.gender = gender
  115.   }
  116. }
  117. 1)从构造器定义在类内部,方法名为this

  118. 2)从构造器必须先调用已经存在的构造器

  119. 4. 继承:继承而来的字段不需要加var或者val


  120. class UniversityStudent(name : String, number : String, val major : String) extends Student(name, number) {
  121.   ......
  122. }
  123. 注意:重写父类的字段或方法要在前面加上override关键字

  124. 5. 抽象类(abstract class)与特质(trait)

  125. 1)抽象方法不需要加关键字,只有声明,没有具体实现。

  126. 2)可以声明抽象字段,也就是没有初始值。

  127. 3)子类重写父类的抽象方法或者抽象字段,不需要加override

  128. trait特质可以理解为可以有具体实现方法的接口,类可以通过with关键字混入(mix-in)特质,同时它的对象也可以混入特质。

  129. Scala程序的执行入口是提供main方法的独立单例对象。同样也可以给一个单例对象混入App特质,去继承App特质中的main方法.

  130. 6. apply方法

  131. 1)对象的apply方法

  132. class ApplyTest {
  133.   println("Test")
  134. }

  135. object ApplyTest {
  136.   def apply() = new ApplyTest
  137. }

  138. // 调用方法
  139. val a = ApplyTest() // 类名+括号,调用对象的apply方法
  140. 上面例子中一个调用apply方法,生成一个新的对象。(绝大多数apply方法都是这样去用)

  141. apply方法就是Scala提供的一个语法糖,对象的apply方法在scala里面非常常用

  142. 例如:


  143. val arr = Array(1, 2, 3)

  144. 实际调用的是

  145. val arr = Array.apply(1, 2, 3)
  146. 以下是Array对象的apply方法源码

  147. object Array extends FallbackArrayBuilding {

  148.    ...
  149.     
  150.    /** Creates an array of `Int` objects */
  151.   // Subject to a compiler optimization in Cleanup, see above.
  152.   def apply(x: Int, xs: Int*): Array[Int] = {
  153.     val array = new Array[Int](xs.length + 1)
  154.     array(0) = x
  155.     var i = 1
  156.     for (x <- xs.iterator) { array(i) = x; i += 1 }
  157.     array
  158.   }
  159.    
  160.   ...

  161. }
  162. 2)类的apply方法


  163. class ApplyTest {
  164.   def apply() {
  165.     println("APPLY Method")
  166.   }
  167.   println("Test")
  168. }

  169. val a = new ApplyTest
  170. a() // 对象名+括号,调用类的apply方法
  171. 7.单例

  172. 用object替换class,其它的跟定义类类似。

  173. 当单例对象与类共享同一个名字时,该对象称作类的伴生对象。

  174. 与Java对比

  175. 如果用作服务器端开发,Scala的简洁、灵活性是Java无法比拟的;如果是企业级应用开发、Web开发,Java的强大是Scala无法匹敌的。我们不用一种语言的优势去抨击另一种语言的短板,所以不要说Java与Scala孰优孰劣,更不要说谁将要取代谁,二者本来就是互补关系。

  176. 总结

  177. scala语言的知识点有太多太多,在一篇博客中不可能做到一一列举。本文只是列举了常用的的几点,希望对正在学习scala的人有所帮助。

  178. 相关博文:Scala快速排序的实现分分钟掌握快速排序

  179. Spark入门博文 Spark初探
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值