Scala语法简介
文章目录
1. Scala语言特性
Scala(short for Scalable Language)是一种混合了面向对象和函数式编程的语言。
具有如下特性:
- 面向对象:Scala是一种纯的面向对象语言,每一个value都是对象
- 函数式:Scala也支持函数式编程,每一个函数都是value。并且支持很多函数式编程的特性:
- anonymous function
- higher-order function
- nested functions
- currying等等
- Scala是静态类型语言,使用type inference来推导变量类型而无需显示说明类型
- Scala跑在JVM上,并且能执行Java代码,使用Java库,语法和Java也很类似
2. Scala基本语法
2.1. 注释
1 2 |
//单行注释 /*多行注释*/ |
2.2. 分号
行末无需分号。但是对于多个语句在同一行时,需要分号;
隔离
2.3. Package
同java
1 2 |
package com.xxx.xxx import com.xxx.xxx |
2.4. if-else
同java。但有时可以压缩为一个表达式
1
|
if(condition) res1 else res2 |
2.5. Loop
for loop:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/*for loop execution with range*/ for( a <- 1 to 3; b < 1 until 3){ println( "Value of a: " + a ); println( "Value of b: " + b ); } //1 until 3 not include 3 //1 to 3 include 3 //the for loop will iterate all possible computations /* for loop execution with a collection*/ val numList = List(1,2,3,4,5,6); for( a <- numList ){ println( "Value of a: " + a ); |
while loop: 同java do-while loop: 同java
2.6. 变量
分为可变变量和不可变变量。
1 2 3 4 5 6 7 8 9 10 |
var myVar : String = "Foo" //mutable variable myVar = "Bar" val myVal : String = "Foo" //immutable variable val myVal2 = "Foo" //type inference /*multiple assignment*/ val (myVar1: Int, myVar2: String) = Pair(40, "Foo") val (myVar1, myVar2) = Pair(40, "Foo") |
2.7. Class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/*class without constructor*/ class SimpleGreeter { val greeting = "Hello, world!" def greet() = println(greeting) } val g = new SimpleGreeter g.greet() /*class with primary constructor*/ //类的定义内,任何不在method内的代码,都默认是primary constructor的代码 class CarefulGreeter(greeting: String) { if (greeting == null) { throw new NullPointerException("greeting was null") } def greet() = println(greeting) } new CarefulGreeter(null) |
2.8. Function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//function declaration def functionName ([list of parameters]) [:return type] //function definition def functionName ([list of parameters]) [:return type] = { function body return [expr] } /* 如果函数体内有return表达式,则[:return type]不可省略。 如果没有return表达式,则[:return type]可省略,而把最后一个表达式的值默认为返回值 */ def hello(name:String="Spark"):String ={ return "hello" +name } def hello(name:String="Spark")={ "hello" +name } //函数体内只有一个表达式时,可以省略{} def square(x: Int): Int = x * x //对于递归函数,不可以省略: return type //如果省略=,则函数不返回值(即返回的类型为Unit) /*匿名函数*/ var mul = (x:Int, y:Int) => x*y mul(2,3) |
2.9. Array
Array是可变对象,元素需要未相同类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var z = new Array[String](3) var z = Array("1","123","asd") z(0) //访问第一个元素,值为"1" z(1) //值为"123" z(0) = "heh" z.distinct z.filter(x => x>0) //过滤掉Array中小于等于0的元素(使用匿名函数) z.filter(x => x<0) //过滤掉Array中大于等于0的元素 |
2.10. Collection
Collectin分为两种:
- List:不可变对象。元素必须是相同类型
- Tuple:不可变对象。元素无须是相同类型
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Define List of integers. val x = List(1,2,3,4) x(0) //访问List的第一个元素,值为1 // Define a set. var x = Set(1,3,5,7) // Define a map. val x = Map("one" -> 1, "two" -> 2, "three" -> 3) // Create a tuple of two elements. val x = (10, "Scala") x._1 //1-based,访问Tuple的第一个元素,值为10 x._2 //访问Tuple的第二个元素,值为"Scala" |
文章作者 Dounm
上次更新 2016-09-10