系列开篇:
Scala要点总结系列博客,主要目的是对scala语言的要点和独特的语法进行快速的梳理,过程中避免涉及深入的理论,点到为止。
系列博客分为5篇,分别为:基本语法,数组集合常用操作,函数式编程,面向对象,模式匹配。
适合有Java语言基础的同学对scala语言进行快速的掌握,因为部分通用的语法,例如操作符等就没有提到,或者作为简易手册进行日常的快速翻查。
更加深入的内容可以阅读书籍[1]。
一. 数据类型
二. 变量
1. 可变变量 variable
var v1 : String = “hello”
或者让scala自己类型推断
var v2 = “hello
2. 不可变变量 value
不可变指的是引用不可变,不是引用的值不可变
val v1 =“String”
三. 访问修饰符
包,类或对象的成员可以使用私有(private)和受保护(protected)的访问修饰符进行标注,默认情况下是 public。
private修饰的成员只能在本类,或者伴生对象中访问,即使是父类也无法访问,而Java则可以。
protected修饰的只能在本类和子类中访问,同一个包下的也不行。
Private后面可以显式的控制访问权限,
package outer {
package inner {
class TestClass {
private[outer] var o = "o"
private[inner] var i = "i"
private[this] var th = "th"
def m1(t: TestClass) {
println(t.o)
println(t.i)
println(t.th) // error
println(this.th) // success
}
}
// 伴生对象
object TestClass {
def m2(): Unit = {
val t = new TestClass
println(t.o)
println(t.i)
println(t.th) // error
}
}
}
}
四. 循环和break
val list1 = List.range(0, 10)
val list2 = List.range(0, 10)
val br = new Breaks
br.breakable {
for (x <- list1 if x % 2 == 0; if x < 5; // 小于5的偶数
y <- list2 if y % 2 != 0; if y >= 5) { // 大于等于5的奇数
if (x + y > 10)
br.break
println("a:" + x + ", b:" + y)
}
}
值得注意的是,Java中的break只能跳出当前的循环,而scala中的break功能更加类似Java中的goto语法,可以轻松的跳出多层循环。
五. 方法和函数
1. 方法
def hello(name : String = "friend"): Unit = {
println("hello " + name)
}
// hello: (name: String)Unit
2. 函数和转换
val func = (name : String) => "hello"+name
// func: String => String = $$Lambda$1197/1479813516@7c070e78
方法属于类的一部分,而函数是一个完整的对象。方法可以没有方法列表,但是函数必须有,即使是空的参数列表。更加详细的区别可以查看文章[2]
大部分场景下,不需要关注两者的区别,当将方法作为参数传入其他高阶的方法时,scala也会自动的将方法转化为函数,也可以自己显式的转换,method _。注意下划线和转换的方法名之间有个空格。
参考文献
[1]: Programming in Scala, Third Editio - Martin Odersky
[2]: scala方法和函数的区别 http://www.runoob.com/w3cnote/scala-different-function-method.html