Scala极速入门

定义

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

安装

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

当前版本2.11.4

设置环境变量

?
1
2
export SCALA _ HOME = /home/mupeng/Hadoop/scala- 2.11 . 4
export PATH = $SCALA _ HOME/bin : $PATH

如果是修改的profile,执行source /etc/profile,使环境变量立即生效。

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

?
1
2
scala -version
Scala code runner version  2.11 . 4  -- Copyright  2002 - 2013 , LAMP/EPFL

Scala解释器

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

?
1
2
3
4
scala
Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
Type  in  expressions to have them evaluated.
Type :help  for  more  information.

先来两个例子,熟悉以下scala解释器

?
1
2
scala> 1+2
res0: Int = 3

结果被命名为res0,Int指结果类型,3指计算结果

?
1
2
scala> println( "hello scala" )
hello scala

输出hello scala

变量

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

scala> var hello = "hello world"

hello: String = hello world

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

函数

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

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

?
1
2
3
def  helloScala  =  {
     println( "Hello Scala!" )
}

2) 函数都有返回结果,无需使用return,函数内最后一个表达式作为返回结果返回。helloScala函数的返回类型为Unit,表示该函数不返回任何有意义的值(相当于Java中的void)。

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

?
1
2
3
def  hello(name  :  String  =  "Scala" :  String  =  {
     return  "Hello : "  + name
}

4) 函数的参数都是val类型,执行过程中不能被改变。(函数式编程的特点,只计算结果,不改变参数)

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

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

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

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

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

循环

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

while循环

?
1
2
3
4
5
var  i = 0
while  (i < args.length) {
   println (args(i))
   i+ = 1
}

for循环

?
1
2
for  (arg <-args)
   println(arg)

for参数里面同样支持if判断,比如输出1——10中的偶数

?
1
2
for  (i <-  1  to  10  if  %  2  ==  0
   println(i)

foreach

?
1
args.foreach(arg  = > println(arg))

因为参数只有一个,表达式也只有一个,可以简写为

?
1
args.foreach(println)

Array与List

创建数组有两种方式

?
1
2
3
4
val  greetStrings  =  new  Array[String]( 3
greetStrings( 0 =  "Hello" 
greetStrings( 1 =  ", " 
greetStrings( 2 =  "world!\n"

或者

?
1
val  numNames  =  Array( "zero" "one" "two" )

注意与Java不同的是:数组的第零个元素是greetStrings(0),不是greetStrings[0]。

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

List长度与值都不可变。

?
1
2
3
4
val  list 1  =  List( 1 2 )
val  list 2  =  List( 3 4 )
val  list 3  =  list 1  :::  list 2   //list3结果为(1,2,3,4)
val  list 4  =  0  ::  list 3        //list4结果为(0,1,2,3,4)

这里有两个操作 ::: 连接两个List

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

类与对象

1. 定义类

?
1
2
3
4
5
6
class  Person {
   var  email  =  "abc123@126.com"  // 变量,var声明会生成getter和setter方法
   var  name  :  String  =  _  // 变量, _起到占位符的作用
   val  age  =  10 ;          // 常变量,val声明只会生成getter
   private  val  gender  =  "male"  //只能在类内部使用
}

缺省访问级别是public,一个源文件中可以有多个class,都是public的。

2. 主构造器

?
1
2
3
class  Student( var  name  :  String,  val  number  :  String) {
   println( "主构造器!" )
}

1)主构造器直接跟在类名后面,主构造器的参数最后会被编译成字段。

2)主构造器执行的时候,会执行类中所有的语句。

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

3. 从构造器

?
1
2
3
4
5
6
7
8
class  Student( var  name  :  String,  val  number  :  String) {
   println( "主构造器!" )
   var  gender  :  String  =  _
   def  this (name  :  String, number  :  String, gender  :  String) {
     this (name, number)
     this .gender  =  gender
   }
}

1)从构造器定义在类内部,方法名为this

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

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

?
1
2
3
class  UniversityStudent(name  :  String, number  :  String,  val  major  :  String)  extends  Student(name, number) {
   ......
}

注意:重写父类的字段或方法要在前面加上override关键字

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

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

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

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

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

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

6. apply方法

1)对象的apply方法

?
1
2
3
4
5
6
7
8
9
10
class  ApplyTest {
   println( "Test" )
}
 
object  ApplyTest {
   def  apply()  =  new  ApplyTest
}
 
// 调用方法
val  =  ApplyTest()  // 类名+括号,调用对象的apply方法

上面例子中一个调用apply方法,生成一个新的对象。(绝大多数apply方法都是这样去用)

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

例如:

?
1
2
3
4
5
val  arr  =  Array( 1 2 3 )
 
实际调用的是
 
val  arr  =  Array.apply( 1 2 3 )

以下是Array对象的apply方法源码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
object  Array  extends  FallbackArrayBuilding {
 
    ...
    
    /** Creates an array of `Int` objects */
   // Subject to a compiler optimization in Cleanup, see above.
   def  apply(x :  Int, xs :  Int*) :  Array[Int]  =  {
     val  array  =  new  Array[Int](xs.length +  1 )
     array( 0 =  x
     var  =  1
     for  (x <- xs.iterator) { array(i)  =  x; i + =  1  }
     array
   }
   
   ...
 
}

2)类的apply方法

?
1
2
3
4
5
6
7
8
9
class  ApplyTest {
   def  apply() {
     println( "APPLY Method" )
   }
   println( "Test" )
}
 
val  =  new  ApplyTest
a()  // 对象名+括号,调用类的apply方法

7.单例

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

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

与Java对比

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

总结

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值