目录
一、基础语法
-
对象、类、方法、字段(对象的属性)
-
脚本形式:scalac、scala
-
object HelloWorld { /* 这是我的第一个 Scala 程序 * 以下程序将输出'Hello World!' */ def main(args: Array[String]) { println("Hello, world!") // 输出 Hello World } }
-
-
区分大小写、类名首字母大写、方法名首字母小写、程序文件名同类名、程序入口:def main(args:Array[String])
-
注释同java
-
换行符,末尾可不加分号
-
定义包两种方式,建议和java一样
-
//java package com.runoob class HelloWorld //c# package com.runoob { class HelloWorld }
-
-
引用
-
import java.awt.Color // 引入Color import java.awt._ // 引入包内所有成员 def handler(evt: event.ActionEvent) { // java.awt.event.ActionEvent ... // 因为引入了java.awt,所以可以省去前面的部分 } import java.awt.{Color, Font} //选取器 // 重命名成员 import java.util.{HashMap => JavaHashMap} // 隐藏成员 import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了 //默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._,这里也能解释,为什么以scala开头的包,在使用时都是省去scala.的。
-
二、数据类型
-
与JAVA相同(Int,Long,Float,Double,Char,String,Boolean,Unit)
-
列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。
-
三、变量
-
变量var;常量val;变量类型声明:变量名之后等号之前
-
在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。
所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。
-
var VariableName : DataType [= Initial Value] 或 val VariableName : DataType [= Initial Value] val xmax, ymax = 100 // xmax, ymax都声明为100 val pa = (40,"Foo") //声明一个元组
-
四、运算符
-
算数运算符
-
关系运算符
-
逻辑运算符
-
位运算符
-
赋值运算符
五、IF。。ELSE。。
-
if(布尔表达式) { // 如果布尔表达式为 true 则执行该语句块 } //实例 object Test { def main(args: Array[String]) { var x = 10; if( x < 20 ){ println("x < 20"); } } } //if...else if(布尔表达式){ // 如果布尔表达式为 true 则执行该语句块 }else{ // 如果布尔表达式为 false 则执行该语句块 } //if..else if..else if(布尔表达式 1){ // 如果布尔表达式 1 为 true 则执行该语句块 }else if(布尔表达式 2){ // 如果布尔表达式 2 为 true 则执行该语句块 }else if(布尔表达式 3){ // 如果布尔表达式 3 为 true 则执行该语句块 }else { // 如果以上条件都为 false 执行该语句块 } //if..else嵌套 if(布尔表达式 1){ // 如果布尔表达式 1 为 true 则执行该语句块 if(布尔表达式 2){ // 如果布尔表达式 2 为 true 则执行该语句块 } }
六、循环
-
//while object Test { def main(args: Array[String]) { // 局部变量 var a = 10; // while 循环执行 while( a < 20 ){ println( "Value of a: " + a ); a = a + 1; } } } //do..while object Test { def main(args: Array[String]) { // 局部变量 var a = 10; // do 循环 do{ println( "Value of a: " + a ); a = a + 1; }while( a < 20 ) } } //for for( var x <- Range ){ statement(s); } //for循环过滤 object Test { def main(args: Array[String]) { var a = 0; val numList = List(1,2,3,4,5,6,7,8,9,10); // for 循环 for( a <- numList if a != 3; if a < 8 ){ println( "Value of a: " + a ); } } } //for使用yield var retVal = for{ var x <- List if condition1; if condition2... }yield x
-
break语句
-
// 导入以下包 import scala.util.control._ // 创建 Breaks 对象 val loop = new Breaks; // 在 breakable 中循环 loop.breakable{ // 循环 for(...){ .... // 循环中断 loop.break; } }
-
七、方法与函数
-
方法和函数的说明
-
Scala 中的方法跟 Java 的类似,方法是组成类的一部分。
-
Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。
-
Scala 中使用 val 语句可以定义函数,def 语句定义方法。
-
Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
-
-
方法声明
-
def functionName ([参数列表]) : [return type]
-
如果你不写等于号和方法主体,那么方法会被隐式声明为抽象(abstract),包含它的类型于是也是一个抽象类型。
-
-
方法定义
-
def functionName ([参数列表]) : [return type] = { function body return [expr] } //example object add{ def addInt( a:Int, b:Int ) : Int = { var sum:Int = 0 sum = a + b return sum } } object Hello{ def printMe( ) : Unit = { println("Hello, Scala!") } }
-
八、字符串、数组、集合
-
字符串用法跟java类似
-
数组(索引用小括号)
-
var z:Array[String] = new Array[String](3) 或 var z = new Array[String](3) var z = Array("Runoob", "Baidu", "Google") //合并数组 mport Array._ object Test { def main(args: Array[String]) { var myList1 = Array(1.9, 2.9, 3.4, 3.5) var myList2 = Array(8.9, 7.9, 0.4, 1.5) var myList3 = concat( myList1, myList2) // 输出所有数组元素 for ( x <- myList3 ) { println( x ) } } } //下表中为 Scala 语言中处理数组的重要方法,使用它前我们需要使用 import Array._ 引入包。
-
-
集合
-
// 定义整型 List val x = List(1,2,3,4) // 定义 Set val x = Set(1,3,5,7) // 定义 Map val x = Map("one" -> 1, "two" -> 2, "three" -> 3) // 创建两个不同类型元素的元组 val x = (10, "Runoob") // 定义 Option val x:Option[Int] = Some(5)
-
九、类和对象
-
// 私有构造方法 class Marker private(val color:String) { println("创建" + this) override def toString(): String = "颜色标记:"+ color //重写一个非抽象方法需要overwrite,子类中重写超类的抽象方法时,你不需要使用override关键字。 } // 伴生对象,与类共享名字,可以访问类的私有属性和方法 object Marker{ private val markers: Map[String, Marker] = Map( "red" -> new Marker("red"), "blue" -> new Marker("blue"), "green" -> new Marker("green") ) def apply(color:String) = { if(markers.contains(color)) markers(color) else null } def getMarker(color:String) = { if(markers.contains(color)) markers(color) else null } def main(args: Array[String]) { println(Marker("red")) // 单例函数调用,省略了.(点)符号 println(Marker getMarker "blue") } } //继承 import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点 : " + x); println ("y 的坐标点 : " + y); } } class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("x 的坐标点 : " + x); println ("y 的坐标点 : " + y); println ("z 的坐标点 : " + z); } } object Test { def main(args: Array[String]) { val loc = new Location(10, 20, 15); // 移到一个新的位置 loc.move(10, 10, 5); } }
十、模式匹配
-
object Test { def main(args: Array[String]) { val alice = new Person("Alice", 25) val bob = new Person("Bob", 32) val charlie = new Person("Charlie", 32) //match相当于switch for (person <- List(alice, bob, charlie)) { person match { case Person("Alice", 25) => println("Hi Alice!") case Person("Bob", 32) => println("Hi Bob!") case Person(name, age) => println("Age: " + age + " year, name: " + name + "?") } } } // 样例类 case class Person(name: String, age: Int) }
十一、文件IO
-
//文件的写 import java.io._ object Test { def main(args: Array[String]) { val writer = new PrintWriter(new File("test.txt" )) writer.write("菜鸟教程") writer.close() } } //读取用户的写入 import scala.io._ object Test { def main(args: Array[String]) { print("请输入菜鸟教程官网 : " ) val line = StdIn.readLine() println("谢谢,你输入的是: " + line) } } //从文件上读取内容 import scala.io.Source object Test { def main(args: Array[String]) { println("文件内容为:" ) Source.fromFile("test.txt" ).foreach{ print } } }