10个Scala基本语法,5分钟就能学会!
引言: 为什么要学Scala?因为要它是Spark的原生语言。那为什么要学好Spark?上一期文章中我们就深刻了解到,Spark计算引擎对于大数据处理实在是太重要了。(本文末另附Scala详细教程PDF)
本篇你只需花5分钟时间,即可掌握10个最基础的Scala语法。
0. Scala简介
这里说一个冷知识,Scala为什么叫Scala呢?
原来“Scala” 得名于 “Scalable Language”,即 “可扩展语言”,是一种多范式编程语言。设计初衷是要集成 “面向对象编程” 和 “函数式编程” 的各种特性。
此外 Scala 还是一门类 Java 的编程语言,可以和 Java 无缝互操作:Scala 类可以调用 Java 方法,创建 Java 对象,继承 Java 类和实现 Java 接口。并且这些都不需要额外的接口定义或者胶合代码。
💡 想要快速会写Scala?👇下面的10个函数从 “Hello,world!”讲到类和对象,帮你快速入门!
1. 打印字符串
Scala使用println
来输出表达式的结果:
println(1) // 1
println(1 + 1) // 2
println("Hello!") // Hello!
println("Hello," + " world!") // Hello, world!
2. 数值(Values)
使用val
关键字命名表达式的结果,称为 “数值”:
val x = 1 + 1
println(x) // 2
注意!数值是不可以被修改的,例如:
x = 3 // 这句话不会被编译
至于数值的类型,既可以省略,也可以明确声明:
val x: Int = 1 + 1 //这里声明了 x是一个整数
3. 变量(Variables)
变量和数值很像,区别在于变量的值是可以修改的。Scala使用var
来定义变量。
var x = 1 + 1
x = 3 // 这句话会被编译,因为 x被声明是变量var,而不是数值val
println(x * x) // 9
与数值一样,变量的类型可以省略,也可以明确声明:
var x: Int = 1 + 1 //声明了x是一个整数型变量
4. 代码块
Scala可以通过将表达式用{ }
括起来,从而组合表达式。我们称其为代码块。
注意,代码块中 最后一个表达式的结果 才是整个块的结果:
println({
val x = 1 + 1
x + 1
}) // 3
5. 函数(Functions)
函数是具有参数并带有参数的表达式。
匿名函数:我们可以用Scala定义匿名函数(没有名称的函数),比如下面这个例子的函数将返回一个给定的整数+1后的结果:
(x: Int) => x + 1
注意,在=>
左侧的是参数列表。=>
右侧是涉及参数的表达式。
命名函数:也可以把上面的匿名函数改写为命名函数:
val addOne = (x: Int) => x + 1
println(addOne(1)) // 2
一个函数可以有多个参数,也可以没有参数:
// 一:定义含有 2个参数的函数:
val add = (x: Int, y: Int) => x + y
println(add(1, 2)) // 3
// 二:定义不含参数的函数
val getTheAnswer = () => 42
println(getTheAnswer()) // 42
6. 方法(Methods)
方法感觉上和函数非常相似,但是它们其实有很大的区别。方法是用def
关键字定义的。def
后跟名称、参数列表、返回类型以及主体:
def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3
大家要注意返回类型Int =
是在参数列表和:
冒号后声明的。
一个方法可以采用多个参数列表:
def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(1, 2)(3)) // 9
// 这个方法实现了两个参数相加后,再与第三个参数相乘。
也可以根本没有参数列表:
def name: String = System.getProperty("user.name")
println("Hello, " + name + "!")
此外,方法当然也可以具有多行表达式:
def getSquareString(input: Double): String = {
val square = input * input
square.toString
}
println(getSquareString(2.5)) // 6.25
这段代码主体中的最后一个表达式是方法的返回值。(Scala其实有一个return
关键字,但很少使用。)
7. 类(Class)
可以使用class关键字,在它后面添加类名和构造函数的参数:
class Greeter(prefix: String, suffix: String) {
def greet(name: String): Unit =
println(prefix + name + suffix)
}
greet方法的返回类型为Unit
,表示没有有意义的返回值。它的用法类似于Java和C中的void
。
定义类之后,可以使用new
创建类的实例:
val greeter = new Greeter("Hello, ", "!")
greeter.greet("Scala开发者") // Hello, Scala开发者!
8. case类(Case Class)
Scala具有一种特殊的类,称为“case类”。默认情况下,case类的实例是不可变的,并且它们通过值进行比较(不同于类,其实例通过引用进行比较)。
使用case class
定义case类:
case class Point(x: Int, y: Int)
可以在不使用new
的情况下实例化case类:
val point = Point(1, 2)
val anotherPoint = Point(1, 2)
val yetAnotherPoint = Point(2, 2)
case类的实例是按值而不是按引用进行比较的:
if (point == anotherPoint) {
println(point + " and " + anotherPoint + " are the same.")
} else {
println(point + " and " + anotherPoint + " are different.")
} // Point(1,2) and Point(1,2) are the same.
if (point == yetAnotherPoint) {
println(point + " and " + yetAnotherPoint + " are the same.")
} else {
println(point + " and " + yetAnotherPoint + " are different.")
} // Point(1,2) and Point(2,2) are different.
9. 对象(Objects)
对象是它们自己的定义的单个实例。可以将它们视为自己类的单例。
使用object
关键字定义对象:
object IdFactory {
private var counter = 0
def create(): Int = {
counter += 1
counter
}
}
可以通过引用对象的名称来访问它:
val newId: Int = IdFactory.create()
println(newId) // 1
val newerId: Int = IdFactory.create()
println(newerId) // 2
10. 特性(traits)
特性是包含某些字段和方法的抽象数据类型。在Scala继承中,一个类只能扩展另一个类,但是可以扩展多个特征。
使用trait
定义特征:
trait Greeter {
def greet(name: String): Unit
}
特性也可以具有默认实现:
trait Greeter {
def greet(name: String): Unit =
println("Hello, " + name + "!")
}
可以使用extends
扩展特征,并使用override
实现覆盖:
class DefaultGreeter extends Greeter
class CustomizableGreeter(prefix: String, postfix: String) extends Greeter {
override def greet(name: String): Unit = {
println(prefix + name + postfix)
}
}
val greeter = new DefaultGreeter()
greeter.greet("Scala开发者") // Hello, Scala开发者!
val customGreeter = new CustomizableGreeter("How are you, ", "?")
customGreeter.greet("Scala开发者") // How are you, Scala开发者?
在这里,DefaultGreeter
仅扩展了一个特征,但其实可以扩展多个特征。
入口:Main方法(Main Method)
最后说一下Main方法,它是Scala程序的入口点。因为Java虚拟机需要一个名为main
的主方法,只带有一个参数:字符串数组。
使用一个对象,我们就可以定义main方法了,如下所示:
object Main {
def main(args: Array[String]): Unit =
println("Hello, Scala developer!")
}
总结和福利
本文介绍了10个Scala最实用的基础语法,你学会了吗?如果还没有,赶快收藏起来重复看~