Scala 语法特性 (三): 面向对象的独特点

发布于: 2020 年 11 月 30 日
Scala语法特性(三):面向对象的独特点

特质Traits

特质(Traits)用于在类(Class)之间共享程序接口(Interface)和字段(Fields),是Scala独有的一种特性,类似于Java 8类和对象(Objects)可以扩展特质,但是特质不能被实例化,因此特质没有参数。



假设,实现一个特质并利用一个类扩展该特质。

trait Iterator[A] {
def hasNext: Boolean
def next(): A
}
// to为Int上限
class IntIterator(to: Int) extends Iterator[Int] {
private var current = 0
override def hasNext: Boolean = current < to
override def next(): Int = {
if (hasNext) {
val t = current
current += 1
return t //此处的return可以省略,直接写t
} else {
return 0
}
}
}
val iterator = new IntIterator(10)
println(iterator.next(), iterator.next()); //结果(0,1)

混入

当某个特质被用于组合类时,被称为混入。一个类只能有一个父类但是可以有多个混入(分别使用关键字extend和with)。混入和某个父类可能有相同的父类。

object HelloScala {
def main(args: Array[String]): Unit = {
abstract class A {
val message: String
}
class B extends A {
val message = "I'm an instance of class B"
}
trait C extends A {
def loudMessage = message.toUpperCase()
}
// D有一个父类B并混入C
class D extends B with C
val d = new D
println(d.message) // I'm an instance of class B
println(d.loudMessage) // I'M AN INSTANCE OF CLASS B
}
}



样例类(Case Class)

在Java中,有一种类只包含get和set方法,这在网站开发与数据库绑定的DAO设计模式中比较常见,而Scala样例类在Scala,默认使用apply方法来处理对象构造,可以通过copy来复制其对象

case class Book(isbn: String) {
def open(): Unit = {
println(isbn);
}
}
val book1 = Book("978-0486282114")
book1.open()
val book2 = book1.copy()
book2.open()

执行结果:

978-0486282114
978-0486282114



假设,利用样本例实现一个模式匹配:

abstract class Person {
val name : String;
val age : Int;
}
case class Student(name:String, age:Int, studentNo:Int) extends Person;
case class Teacher(name:String, age:Int, teacherNo:Int) extends Person;
case class Cleaner(name:String, age:Int) extends Person;
val p:Person=Student("john",18,1024)
//match case 匹配语法
p match {
case Student(name,age,studentNo)=>println("Student- " + name+":"+age+":"+studentNo)
case Teacher(name,age,teacherNo)=>println("Teacher-" + name+":"+age+":"+teacherNo)
case Cleaner(name, age)=>println("Cleaner-" + name + ":" + age)
}

执行结果:

Student- john:18:1024



单例对象

Scala对象无需New对象,实现示例如下:

object HelloScala {
def main(args: Array[String]): Unit = {
def info(message : String) : Unit = {
println(s"INFO: $message")
}
HelloScala.info("Example of Static Object")
}
}

执行结果:

INFO: Example of Static Object



生成伴生对象

还可以将类和object放在同一个文件中,形成伴生对象。

import scala.math._
case class Circle(radius : Double) {
import Circle._
def area: Double = calculateArea(radius)
}
object Circle {
private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)
}
val circle1 = new Circle(5.0)
println(circle1.area)

执行结果:

78.53981633974483

参考资料

  • 书籍《Spark Streaming 实时流式大数据处理实战》

发布于: 2020 年 11 月 30 日阅读数: 16
用户头像

正向成长 2018.08.06 加入

想要坚定地做大规模数据处理(流数据方向),希望结合结合批处理的传统处理方式,以及之后流批混合处理方向进行学习和记录。

评论

发布
暂无评论
Scala语法特性(三):面向对象的独特点