Spark笔记之Scala语法基础

1.ScalaJava的关系:因为Scala是基于Java虚拟机,也就是JVM的一门编程语言。所有Scala的代码,都需要经过编译为字节码,然后交由Java虚拟机来运行。

所以ScalaJava是可以无缝互操作的。Scala可以任意调用Java的代码。所以ScalaJava的关系是非常非常紧密的。

2.函数:如果函数体中有多行代码,则可以使用代码块的方式包裹多行代码,代码块中最后一行的返回值就是整个函数的返回值。与Java中不同,不是使用return返回值的。如果在函数体内递归调用函数自身,则必须手动给出函数的返回类型。

Scala中,有时我们需要将函数定义为参数个数可变的形式,则此时可以使用变长参数定义函数。

def sum(nums: Int*) = {

  var res = 0

  for (num <- nums) res += num

  res

}

sum(1, 2, 3, 4, 5)

将一个已有的序列调用变长参数函数: val s = sum(1 to 5: _*)

Scala中,定义函数时,如果函数体直接包裹在了花括号里面,而没有使用=连接,则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。

过程还有一种写法,就是将函数的返回值类型定义为Unit

Scala中,提供了lazy值的特性,也就是说,如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会发生计算。这种特性对于特别耗时的计算操作特别有用,比如打开文件进行IO,进行网络IO等。

3.伴生对象:

如果有一个class,还有一个与class同名的object,那么就称这个objectclass的伴生对象,classobject的伴生类

伴生类和伴生对象必须存放在一个.scala文件之中

伴生类和伴生对象,最大的特点就在于,互相可以访问private field

4. apply方法:

通常在伴生对象中实现apply方法,并在其中实现构造伴生类的对象的功能

而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式地调用伴生对象得apply方法,这样会让对象创建更加简洁

// 比如,定义自己的伴生类和伴生对象

class Person(val name: String)

object Person {

  def apply(name: String) = new Person(name)

}

5.继承:

子类可以覆盖父类的fieldmethod;但是如果父类用final修饰,fieldmethodfinal修饰,则该类是无法被继承的,fieldmethod是无法被覆盖的

子类可以覆盖父类的val field,而且子类的val field还可以覆盖父类的val fieldgetter方法;只要在子类中使用override关键字即可

6.函数式编程:

Scala是一门既面向对象,又面向过程的语言。因此在Scala中有非常好的面向对象的特性,可以使用Scala来基于面向对象的思想开发大型复杂的系统和工程;而且Scala也面向过程,因此Scala中有函数的概念。在Scala中,函数与类、对象等一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖任何类和对象。

Scala的函数式编程,就是Scala面向过程的最好的佐证。也正是因为函数式编程,才让Scala具备了Java所不具备的更强大的功能和特性。

6.1 将函数赋值给变量

// Scala中的函数是一等公民,可以独立定义,独立存在,而且可以直接将函数作为值赋 值给变量,Scala的语法规定,将函数赋值给变量时,必须在函数后面加上空格和下划线

def sayHello(name: String) { println("Hello, " + name) }

val sayHelloFunc = sayHello _

sayHelloFunc("leo")

6.2匿名函数

// Scala中,函数也可以不需要命名,此时函数被称为匿名函数。// 可以直接定义函数之 后,将函数赋值给某个变量;也可以将直接定义的匿名函数传入其他函数之中

// Scala定义匿名函数的语法规则就是,(参数名: 参数类型) => 函数体

val sayHelloFunc = (name: String) => println("Hello, " + name)

7.高阶函数:

// 接收其他函数作为参数的函数,也被称作高阶函数(higher-order function

val sayHelloFunc = (name: String) => println("Hello, " + name)

def greeting(func: (String) => Unit, name: String) { func(name) }

greeting(sayHelloFunc, "leo")

// 高阶函数的另外一个功能是将函数作为返回值

def getGreetingFunc(msg: String) = (name: String) => println(msg + ", " + name)

val greetingFunc = getGreetingFunc("hello")

greetingFunc("leo")

闭包:

def getGreetingFunc(msg: String) = (name: String) => println(msg + ", " + name)

val greetingFuncHello = getGreetingFunc("hello")

val greetingFuncHi = getGreetingFunc("hi")

// 两次调用getGreetingFunc函数,传入不同的msg,并创建不同的函数返回

// 然而,msg只是一个局部变量,却在getGreetingFunc执行完之后,还可以继续存在创建的函数之中;greetingFuncHello("leo"),调用时,值为"hello"msg被保留在了函数体内部,可以反复的使用

// 这种变量超出了其作用域,还可以使用的情况,即为闭包

8.ActorScalaActor类似于Java中的多线程编程。但是不同的是,ScalaActor提供的模型与多线程有所不同。ScalaActor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能。此外,Scala Actor的这种模型还可以避免死锁等一系列传统多线程编程的问题。

Spark中使用的分布式多线程框架,是AkkaAkka也实现了类似Scala Actor的模型,其核心概念同样也是Actor

// Scala提供了Actor trait来让我们更方便地进行actor多线程编程,就Actor trait就类似于Java中的ThreadRunnable一样,是基础的多线程基类和接口。我们只要重写Actor traitact方法,即可实现自己的线程执行体,与Java中重写run方法类似。

// 此外,使用start()方法启动actor;使用!符号,向actor发送消息;actor内部使用receive和模式匹配接收消息

// 案例:Actor Hello World

import scala.actors.Actor

class HelloActor extends Actor {

  def act() {

    while (true) {

      receive {

        case name: String => println("Hello, " + name)

      }

    }

  }

}

val helloActor = new HelloActor

helloActor.start()

helloActor ! "leo"

Actor之间互相收发消息

// 如果两个Actor之间要互相收发消息,那么scala的建议是,一个actor向另外一个actor发送消息时,同时带上自己的引用;其他actor收到自己的消息时,直接通过发送消息的actor的引用,即可以给它回复消息。

// 案例:打电话

case class Message(content: String, sender: Actor)

class LeoTelephoneActor extends Actor {

  def act() {

    while (true) {

      receive {

        case Message(content, sender) => { println("leo telephone: " + content); sender ! "I'm leo, please call me after 10 minutes." }

      }

    }

  }

}

class JackTelephoneActor(val leoTelephoneActor: Actor) extends Actor {

  def act() {

    leoTelephoneActor ! Message("Hello, Leo, I'm Jack.", this)

    receive {

      case response: String => println("jack telephone: " + response)

    }

  }

}

猜你喜欢

转载自blog.csdn.net/qq_30062385/article/details/79703367