首页 > 代码库 > Scala编程基础
Scala编程基础
安装Scala
Scala
声明变量
数据类型与操作符
函数调用与apply()
if表达式
语句终结符、块表达式
输入和输出
循环
高级for循环
函数的定义与调用
在代码块中定义包含多行语句的函数体
递归函数与返回类型
默认参数
函数调用时带名参数
变长参数
序列作为变长参数
过程
lazy
异常
Array
ArrayBuffer
遍历Array和ArrayBuffer
数组常见操作
Scala与Java的关系
Scala
因为Scala是基于
所以Scala和
安装Scala
·
·使用下载下来的安装包安装
·在
·在
Scala解释器的使用
·计算表达式
·例如,输入
·内置变量:
·例如,
·例如,
·自动补全:
·例如,输入
·例如,输入
声明变量
·声明
·例如,
·后续这些常量是可以继续使用的,例如,
·但是常量声明后,是无法改变它的值的,例如,
·声明
·例如,
·但是在
·在
·指定类型:
·例如,
·例如,
·声明多个变量:
·例如,
·例如,
数据类型与操作符
·基本数据类型:
·乍一看与
·使用以上类型,直接就可以调用大量的函数,例如,
·类型的加强版类型
·例如,
·例如,
·基本操作符:
·但是,在
·例如,
·scala中没有提供
函数调用与apply()函数
·函数调用方式:
·例如,
·不同的一点是,如果调用函数时,不需要传递参数,则
·apply函数
·Scala
·例如,
·例如,
if表达式
·if表达式的定义:在Scala
·
·
·
·if表达式的类型推断:由于if
·
·
·
·将if语句放在多行中:
·
if(age > 18) { "adult"
} else if(age > 12) "teenager"else "children"
语句终结符、块表达式
·默认情况下,scala不需要语句终结符,默认将每一行作为一个语句
·一行放多条语句:如果一行要放多条语句,则必须使用语句终结符
·
·
if(a < 10) {
b = b + 1
c = c + 1
}
·块表达式:块表达式,指的就是
·
输入和输出
·print
·
·printf
·
·readLine: readLine
·综合案例:游戏厅门禁
val name = readLine("Welcome to GameHouse. Please tell me your name: ")
print("Thanks. Then please tell meyour age: ")
val age = readInt()
if(age > 18) {
printf("Hi, %s, you are %dyears old, so you are legel to come here!", name, age)
} else {
printf("Sorry, boy, %s, you areonly %d years old. you are illegal to come here!", name, age)
}
循环
·while do
var n = 10
while(n > 0) {
println(n)
n -= 1
}
·Scala
·
·
·跳出循环语句
·
import scala.util.control.Breaks._
breakable {
var n = 10
for(c <- "HelloWorld") {
if(n == 5) break;
print(c)
n -= 1
}
}
高级for循环
·多重for循环:九九乘法表
for(i <- 1 to 9; j <- 1 to 9) {
if(j == 9) {
println(i * j)
} else {
print(i * j + "")
}
}
·if守卫:取偶数
for(i <- 1 to 100 if i % 2 == 0)println(i)
·for
for(i <- 1 to 10) yield i
函数的定义与调用
在Scala
我们的第一个函数如下所示:
def sayHello(name: String, age: Int) = {
if (age > 18) { printf("hi%s, you are a big boy\n", name); age }
else { printf("hi %s, you are alittle boy\n", name); age
}
sayHello("leo", 30)
Scala要求必须给出所有参数的类型,但是不一定给出函数返回值的类型,只要右侧的函数体中不包含递归的语句,
在代码块中定义包含多行语句的函数体
单行的函数:defsayHello(name: String) = print("Hello, " + name)
如果函数体中有多行代码,则可以使用代码块的方式包裹多行代码,代码块中最后一行的返回值就是整个函数的返回值。与
比如如下的函数,实现累加的功能:
def sum(n: Int) = {
var sum = 0;
for(i <- 1 to n) sum += i
sum
}
递归函数与返回类型
如果在函数体内递归调用函数自身,则必须手动给出函数的返回类型。
例如,实现经典的斐波那契数列:
9 + 8; 8 + 7 + 7 + 6; 7 + 6 + 6 + 5 + 6 + 5+ 5 + 4; ....
def fab(n: Int): Int = {
if(n <= 1) 1
else fab(n - 1) + fab(n - 2)
}
默认参数
在Scala
def sayHello(firstName: String, middleName:String = "William", lastName: String = "Croft") = firstName+ " " + middleName + " " + lastName
如果给出的参数不够,则会从左往右依次应用默认参数。
def sayHello(name: String, age: Int = 20) {
print("Hello, " + name +", your age is " + age)
}
sayHello("leo")
函数调用时带名参数
在调用函数时,也可以不按照函数定义的参数顺序来传递参数,而是使用带名参数的方式来传递。
sayHello(firstName = "Mick",lastName = "Nina", middleName = "Jack")
还可以混合使用未命名参数和带名参数,但是未命名参数必须排在带名参数前面。
sayHello("Mick", lastName ="Nina", middleName = "Jack")
变长参数
在Scala
def sum(nums: Int*) = {
var res = 0
for (num <- nums) res += num
res
}
sum(1, 2, 3, 4, 5)
序列作为变长参数
在如果想要将一个已有的序列直接调用变长参数函数,是不对的。比如
val s = sum(1 to 5: _*)
案例:使用递归函数实现累加
def sum2(nums: Int*): Int = {
if (nums.length == 0) 0
else nums.head + sum2(nums.tail: _*)
}
过程
在Scala
过程还有一种写法,就是将函数的返回值类型定义为
def sayHello(name: String) = "Hello," + name//函数
def sayHello(name: String) {print("Hello, " + name); "Hello, " + name }//
def sayHello(name: String): Unit ="Hello, " + name//有值,有
lazy值
在Scala
import scala.io.Source._
lazy val lines =fromFile("C://Users//Administrator//Desktop//test.txt").mkString
即使文件不存在,也不会报错,只有第一个使用变量时会报错,证明了表达式计算的
val lines =fromFile("C://Users//Administrator//Desktop//test.txt").mkString
lazy val lines =fromFile("C://Users//Administrator//Desktop//test.txt").mkString
def lines =fromFile("C://Users//Administrator//Desktop//test.txt").mkString
异常
在Scala
try {
throw newIllegalArgumentException("x should not be negative")
} catch {
case _: IllegalArgumentException=> println("Illegal Argument!")
} finally {
print("releaseresources!")
}
Import java.io._
try {
throw new IOException(“ioexception!!!")
} catch {
case _: IllegalArgumentException=> println("illegal argument")
}
try {
throw new IOException("userdefined exception")
} catch {
case e1: IllegalArgumentException=> println("illegal argument")
case e2: IOException =>println("io exception")
}
Array
在Scala
// 数组初始化后,长度就固定下来了,而且元素全部根据其类型初始化
val a = new Array[Int](10)
a(0)
a(0) = 1
val a = new Array[String](10)
// 可以直接使用
val a = Array("hello","world")
a(0) = "hi"
val a = Array("leo", 30)
ArrayBuffer
在Scala
// 如果不想每次都使用全限定名,则可以预先导入
import scala.collection.mutable.ArrayBuffer
// 使用
val b = ArrayBuffer[Int]()
// 使用
// 这个语法必须要谨记在心!因为
b += 1
b += (2, 3, 4, 5)
// 使用
b ++= Array(6, 7, 8, 9, 10)
// 使用
b.trimEnd(5)
// 使用
// 但是这种操作效率很低,因为需要移动指定位置后的所有元素
b.insert(5, 6)
b.insert(6, 7, 8, 9, 10)
// 使用
b.remove(1)
b.remove(1, 3)
// Array与ArrayBuffer可以互相进行转换
b.toArray
a.toBuffer
遍历Array和ArrayBuffer
// 使用
// 使
for (i <- 0 until b.length)
println(b(i))
// 跳跃遍历
for(i <- 0 until (b.length, 2))
println(b(i))
// 从尾部遍历
for(i <- (0 until b.length).reverse)
println(b(i))
// 使用
for (e <- b)
println(e)
数组常见操作
// 数组元素求和
val a = Array(1, 2, 3, 4, 5)
val sum = a.sum
// 获取数组最大值
val max = a.max
// 对数组进行排序
scala.util.Sorting.quickSort(a)
// 获取数组中所有元素内容
a.mkString
a.mkString(", ")
a.mkString("<", ",",">")
// toString函数
a.toString
b.toString
附件列表
Scala编程基础