Scala的基础

目录

1.什么是Scala

2.安装Scala

3.Scala基础

4.数据类型

5.方法与函数

5.1.方法的定义使用def关键字,语法:

5.2.函数

6.抽象类和特质


1.什么是Scala

        Scala是一种将面向对象和函数式编程结合在一起的高级语言,设计初衷是要集成面向对象编程和函数式编程的各种特性,旨在以简洁、优雅和类型安全的方式表达通用编程模式。Scala功能强大,不仅可以编写简单脚本,还可以构建大型系统。

        由于Spark主要是由Scala语言编写的,为了后续更好的学习Spark以及使用Scala编写Spark应用程序,需要首先学习使用Scala语言。

2.安装Scala

        由于Scala运行于Java平台,因此安装Scala之前需要确保系统安装了JDK。此处使用的Scala版本为2.12.7,要求JDK版本为1.8。

Scala 依赖 jdk,jdk 下载:Java Downloads | Oracle

Sclal下载:https://www.scala-sbt.org/download.html

解压到指定目录:

$ tar -zxvf scala-2.12.7.tgz -C /opt/modules/

配置环境变量: 

export SCALA_HOME=/opt/modules/scala-2.12.7/
export PATH=$PATH:$SCALA_HOME/bin
3.Scala基础

        最初学习Scala的时候建议在Scala命令行模式中操作,最终程序的编写可以在IDE中进行。在Windows CMD窗口中或CentOS的Shell命令中执行“scala”命令,即可进入Scala的命令行操作模式。

4.数据类型

        Any是Scala类层次结构的根,也被称为超类或顶级类。Scala执行环境中的每个类都直接或间接地从该类继承。该类中定义了一些通用的方法,例如equals()、hashCode()和toString()。Any有两个直接子类:AnyVal和AnyRef。 AnyVal表示值类型。有9种预定义的值类型,它们是非空的Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是一个不包含任何信息的值类型,和Java语言中的void等同,用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 AnyRef表示引用类型。所有非值类型都被定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型。AnyRef对应于Java中的Java.lang.Object。 Nothing是所有类型的子类,在Scala类层级的最低端。Nothing没有对象,因此没有具体值,但是可以用来定义一个空类型,类似于Java中的标示性接口(如:Serializable,用来标识该类可以进行序列化)。举个例子,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回)。 Null是所有引用类型(AnyRef)的子类,所以Null可以赋值给所有的引用类型,但不能赋值给值类型,这个和Java的语义是相同的。Null有一个唯一的单例值null。

5.方法与函数

Scala中有方法与函数。Scala 方法是类或对象中定义的成员,而函数是一个对象,可以将函数赋值给一个变量。换句话说,方法是函数的特殊形式。

5.1.方法的定义使用def关键字,语法:
def 方法名 (参数列表):返回类型={
   方法体
}
例如,将两个数字求和然后返回,返回类型为Int:
def addNum( a:Int, b:Int ) : Int = {
      var sum = 0
      sum = a + b
      return sum
}
代码简写,去掉返回类型和return关键字:
def addNum( a:Int, b:Int ) = {
      var sum = 0
      sum = a + b
      sum
如果方法没有返回结果,可以将返回类型设置为Unit,类似Java中的void:
def addNum( a:Int, b:Int ) : Unit = {
      var sum = 0
      sum = a + b
      println(sum)
}
在定义方法参数时,可以为某个参数指定默认值,在方法被调用时可以不为带有默认值的参数传入实参:
def addNum( a:Int=5, b:Int ) = {
      var sum = 0
      sum = a + b
      sum
}
5.2.函数
函数的定义与方法不一样,语法:
(参数列表)=>函数体
定义一个匿名函数,参数为a和b,且都是Int类型,函数体为a+b:
( a:Int, b:Int ) =>a+b
如果函数体有多行,可以将函数体放入一对{}中,并且可以通过一个变量来引用函数,变量相当于函数名称:
val f1=( a:Int, b:Int ) =>{ a+b }
对上述函数进行调用:
f1(1,2)
函数也可以没有参数:
val f2=( ) =>println("hello scala")
对上述函数进行调用:
f2()
定义一个方法m1,参数f要求是一个函数,该函数有两个Int类型参数,且函数的返回类型为Int,方法体中直接调用该函数:
def m1(f: (Int, Int) => Int): Int = {
  f(2, 6)
 }
定义一个函数f1:
val f1 = (x: Int, y: Int) => x + y
调用方法m1,并传入函数f1:
val res = m1(f1)
println(res)
输出结果为8。
当把一个方法作为参数传递给其它的方法或者函数时,系统将自动将该方法转换为函数。
例如,有一个方法m2:
def m2(x:Int,y:Int) = x+y
调用(2)中的m1方法,并将m2作为参数传入,此时系统会自动将m2方法转为函数:
val res = m1(m2)
println(res)
输出结果为8。
除了系统自动转换外,也可以手动进行转换。在方法名称后加入一个空格和一个下划线,即可将方法转换为函数:
val f2=m2 _
val res=m1(f2)
println(res)
输出结果为8。
6.抽象类和特质

Scala的抽象类使用关键字abstract定义,具有以下特征:

  • 抽象类不能被实例化。
  • 抽象类中可以定义抽象字段(没有初始化的字段)和抽象方法(没有被实现的方法),也可以定义被初始化的字段和被实现的方法。
  • 若某个子类继承了一个抽象类,则必须实现抽象类中的抽象字段和抽象方法。且实现的过程中可以添加override关键字也可以省略。若重写了抽象类中已经实现的方法,则必须添加override关键字。
定义一个抽象类Person:
abstract class Person {
  var name:String //抽象字段
  var age:Int
  var address:String="北京"  //普通字段
  def speak() //抽象方法
  def eat():Unit={ //普通方法
    println("吃东西")
  }
}
定义一个普通类Teacher,并继承抽象类Person,实现Person中的抽象字段和抽象方法,并重写方法eat():
//继承了抽象类Person
class Teacher extends Person{
  //实现抽象字段
  var name: String = "王丽"
  var age: Int = 28
  //实现抽象方法
  def speak(): Unit = {
    println("姓名:"+this.name)
    println("年龄:"+this.age)
    println("地址:"+this.address)//继承而来
    println("擅长讲课")
  }  
  //重写非抽象方法,必须添加override关键字
  override def eat():Unit={
    println("爱吃中餐")
  }
}

Scala特质使用关键字trait定义,类似Java中使用interface定义的接口。特质除了有Java接口的功能外,还有一些特殊的功能。

定义了一个特质Pet:
//定义特质(宠物)
trait Pet {
  var name:String //抽象字段
  var age:Int
  def run //抽象方法
  def eat: Unit ={ //非抽象方法
    println("吃东西")
  }
}
定义一个普通类Cat,实现了上述特质Pet(必须实现未实现的字段和方法):
class Cat extends Pet
  var name:String="john" { //实现抽象字段
  var age:Int=3
  def run: Unit = {//实现抽象方法
    println("会跑")
  }
override def eat: Unit ={ //重写非抽象方法
    println("吃鱼")
  }
}
若需要实现多个特质,可以通过with关键字添加额外特质,但位于最左侧的特质必须使用extends关键字:
trait Animal{
}
trait Runable{
}
//类Dog实现了三个特质
class Dog extends Pet with Animal with Runable{

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值