vlambda博客
学习文章列表

10个Scala基本语法,5分钟就能学会!

引言: 为什么要学Scala?因为要它是Spark的原生语言。那为什么要学好Spark?上一期文章中我们就深刻了解到,Spark计算引擎对于大数据处理实在是太重要了。(本文末另附Scala详细教程PDF)

10个Scala基本语法,5分钟就能学会!

本篇你只需花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(12)) // 3

// 二:定义不含参数的函数
val getTheAnswer = () => 42
println(getTheAnswer()) // 42

6. 方法(Methods)

方法感觉上和函数非常相似,但是它们其实有很大的区别。方法是用def关键字定义的。def后跟名称、参数列表、返回类型以及主体:

def add(x: Int, y: Int): Int = x + y
println(add(12)) // 3

大家要注意返回类型Int =是在参数列表和:冒号后声明的。

一个方法可以采用多个参数列表:

def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(12)(3)) // 9
// 这个方法实现了两个参数相加后,再与第三个参数相乘。

也可以根本没有参数列表:

def nameString = 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(12)
val anotherPoint = Point(12)
val yetAnotherPoint = Point(22)

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: Stringextends 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最实用的基础语法,你学会了吗?如果还没有,赶快收藏起来重复看~

数据科学家联盟
在数据科学的道路上共同成长,有你有我,就是联盟。
127篇原创内容
Official Account