目录
10. trait(特质)和 abstract class(抽象类)的区别
1. Scala 语言的优点
- Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性
- Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序
- Scala 源代码被变编译成 Java 字节码,所以它可以运行于 JVM之上,并可以调用现有的 Java 类库
- 作为流行的开源大数据内存计算引擎 Spark 的源码编程语言,Spark 有着良好的性能优势
- Scala 将成为未来大数据处理的主流语言
2. Scala 中的闭包
定义:可以在任何作用域内定义函数、包、类甚至是另一个函数或方法。在函数体内,可以访问到相应作用域内地任何变量。(重点)函数可以在变量不再处于作用域内时被调用。
object Test {
/**
* scala中的闭包
* 函数在变量不处于其有效作用域内,还能够对变量进行访问
*
* @param args
*/
def main(args: Array[String]): Unit = {
def getHelloFunc(msg:String) = (name:String) => println(msg + "," + name)
val sayHello = getHelloFunc("hello") // 传入msg的值 ,后面sayHello依然可以访问到
val sayHi = getHelloFunc("hi")
// 两次条用getHelloFunc,传入不同的msg,创建不同的函数返回
// 然而msg只是一个局部变量,
// 在getHelloFunc调用后,还继续存在创建的函数中,当sayHello("yxj")调用时,值为hello的msg保留在了函数内部,可以反复使用
// 这种变量超出了其作用域,还可以使用的情况,就是闭包
// scala
sayHello("yxj") // 打印 hello,yxj
sayHi("yxj") // 打印 hi,yxj
}
}
3. Scala 中的柯里化
柯里化函数也叫多参数列表函数,本身就是指把接受多分参数的函数变化成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术
简单理解就是改变函数的形式,不改变函数的功能。用途:和隐式参数结合使用大大简化代码,但降低了代码的可读性
//该函数接受两个参数
def mul(x:Int,y:Int) = x*y
//该函数接受一个参数生成另外一个接受单个参数的函数
def mulOneAtTime(x:Int)(y:Int) = x*y
//也可以写成
def mulOneAtTime(x:Int) = (y:Int) => x * y
4. Java 和 Scala 的联系和区别
联系:
- Scala 源于 Java,但又高于 Java,Scala 在 Java 的基础上增加了函数式编程,让开发人员可以通过函数式编程来开发程序
- 由于 Scala 最终被编译为 .class 文件运行在 JVM 中,其实本质上还是 Java,所以在 Scala 和 Java 可以互调双方的 API
区别:
- 变量的声明:
- 变量 var 常量 val,Scala 支持自动类型推测
- Scala 更多的是采用常量而不是变量来解决问题,好处是可以减少多线程并发的安全问题,特别适合用于多并发分布式的场景
- 函数的声明
- 关键字 def,Scala 函数没有返回值用 Unit,相当于 Java 中的 void
- Scala 支持函数式编程,可以使用高阶函数,函数在 Scala 中是一等公民
- 基本类型
- Scala 是存粹的面向对象的编程语言,所以并没有真正意义上的基本类型,他的类型都是类
- 静态
- Java 中静态 static 是违背 Java 面向对象的编程思想和封装特性的
- Scala