Scala基本语法总结(一)
Scala基本语法总结
时隔快一年了,又捡起scala,不是想学的有多么的精通,只是想把之前遇到的知识点和实践中遇到的重点进行归纳总结,对以后的面试或许有点帮助吧!
一、scala开发环境的配置
我这里分享一下有道云笔记的地址,有之前学习的时候对scala的安装方法的详细描述,有兴趣的可以看看
http://note.youdao.com/noteshare?id=92d3d18863c6273da580130bddfc4890&sub=09306077167D4C6882E089FE4A390BAE
二、scala的基本语法
1、定义变量
- val:val类似于Java中的final变量,一旦初始化之后,不可以重新赋值(我们可以称它为常量)
- var:var 类似于一般的非final变量。可以任意重新赋值。
Scala 可以根据赋值的内容推算出变量的类型,如:(一般情况都是用推算的方式定义的)
scala> val msg="Hello,World"
msg: String = Hello,World
你也可以在定义变量的时候指定他的类型,如:
scala> val msg2:String ="Hello again,world"
msg2: String = Hello again,world
2、定义函数
Scala 既是面向对象的编程语言,也是面向函数的编程语言,因此函数在 Scala 语言中的地位和类是同等第一位的。
scala> def max(x:Int,y:Int) : Int ={
| if (x >y) x
| else
| y
| }
max: (x: Int, y: Int)Int
Scala 函数以 def 定义,然后是函数的名称(如 max),然后是以逗号分隔的参数。Scala 中变量类型是放在参数和变量的后面,以“:”隔开。同样如果函数需要返回值,它的类型也是定义在参数的后面(实际上每个 Scala 函数都有返回值,只是有些返回值类型为 Unit,类似为java语言中的 void 类型)。
每个 Scala 表达式都有返回结果(这一点和 Java,C# 等语言不同),比如 Scala 的 if else 语句也是有返回值的,因此函数返回结果无需使用 return 语句。实际上在 Scala 代码应当尽量避免使用 return 语句。函数的最后一个表达式的值就可以作为函数的结果作为返回值。大多数函数 Scala 都可以推测出函数返回值的类型,但目前来说回溯函数(函数调用自身)还是需要指明返回结果类型的。
3、使用 while 配合 if 实现循环
var i=0
while (i < args.length) {
println (args(i))
i+=1
}
运行方式和结果:
这里要注意的是:
- Scala 不支持 ++i,i++ 运算符,因此需要使用 i += 1 来加一。
- Scala访问数组的语法是使用()而非[]。
- args 接收传递的参数列表
这里介绍了使用 while 来实现循环,但这种实现循环的方法并不是最好的 Scala 风格,下面介绍一种更好的方法来避免通过索引来枚举数组元素。
4、使用 foreach 和 for 来实现迭代
上面使用 while 来实现循环,和使用 Java 实现无太大差异,而 Scala 是面向函数的语言,更好的方法是采用“函数式“风格来编写代码。比如上面的循环,使用 foreach 方法如下:
args.foreach(arg => println(arg))
该表达式,调用 args 的 foreach 方法,传入一个参数,这个参数类型也是一个函数。这段代码可以再写的精简些,你可以利用 Scala 支持的缩写形式,如果一个函数只有一个参数并且只包含一个表达式,那么你无需明确指明参数。因此上面的代码可以写成:
args.foreach( println)
Scala 中也提供了一个称为 “for comprehension” 的比 Java 中 for 表达式功能更强大。“for comprehension” ,这里先使用 for 来实现前面的例子:
for (arg <-args)
println(arg)
5、数组的定义和应用
在 Scala 中你可以使用 new 来实例化一个类。当你创建一个对象的实例时,你可以使用数值或类型参数。如果使用类型参数(指定你定义的数组的类型),它的作用类似 Java 中的类型。所不同的是 Scala 使用方括号来指明数据类型参数,而非尖括号(java)。比如
val greetStrings =new Array[String](3)
greetStrings(0)="Hello"
greetStrings(1)=","
greetStrings(2)="world!\n"
for(i <- 0 to 2)
print(greetStrings(i))
可以看到 Scala 使用[]来为数组指明类型化参数,本例使用 String 类型,数组使用()而非[]来指明数组的索引。其中的 for 表达式中使用到 0 to 2 ,这个表达式演示了 Scala 的一个基本规则,如果一个方法只有一个参数,你可以不用括号和. 来调用这个方法。因此这里的 0 to 2, 其实为(0).to(2) 调用的为整数类型的 to 方法,to 方法使用一个参数。
Scala 中所有的基本数据类型也是对象(和 Java 不同),因此 0 可以有方法(实际上调用的是 RichInt 的方法),这种只有一个参数的方法可以使用操作符的写法(不用.和括号),实际上 Scala 中表达式 1+2,最终解释为 (1).+(2) + 也是 Int 的一个方法,和 Java 不同的是,Scala 对方法的名称没有太多的限制,你可以使用符合作为方法的名称。
这里说明一下为什么 Scala 中使用()来访问数组元素。在 Scala 中,数组和其它普遍的类定义一样,没有什么特别之处,当你在某个值后面使用()时,Scala 将其翻译成对应对象的 apply 方法。因此本例中 greetStrings(1) 其实调用 greetString.apply(1) 方法。这种表达方法不仅仅只限于数组,对于任何对象,如果在其后面使用(),都将调用该对象的 apply 方法。同样的如果对某个使用()的对象赋值,比如:
greetStrings(0)="Hello"
Scala 将这种赋值转换为该对象的 update 方法, 也就是 greetStrings.update(0,”hello”)。因此上面的例子,使用传统的方法调用可以写成:
val greetStrings =new Array[String](3)
greetStrings.update(0,"Hello")
greetStrings.update(1,",")
greetStrings.update(2,"world!\n")
for(i <- 0 to 2)
print(greetStrings.apply(i))
不过 Scala 还是提供了初始化数组的简单的方法,比如初始化数组可以使用如下代码:
val greetStrings =Array("Hello",",","World\n")
这里使用()其实还是调用 Array 类的关联对象 Array 的 apply 方法,也就是
val greetStrings =Array.apply("Hello",",","World\n")
数组总结几点如下:
- 使用 [] 来为数组指明类型
- 使用 () 来指明数组的索引
- Scala 中所有的基本数据类型也是对象,因此可以使用(1).+(2),(0).to(2), +和to都是Int的方法
- Scala 的一个基本规则,如果一个方法只有一个参数,你可以不用括号和. 来调用这个方法,比如:1+2,0 to 2
- 对于任何对象,如果在其后面使用(),都将调用该对象的 apply 方法
- 对象的赋值语句,都将转化成该对象的update方法