Scala既是面向对象的语言,也是面向函数的语言。scala可以为你在做大量代码重用和扩展是提供优雅的层次结构,并可以通过高阶函数来实现这样的目标。(高阶函数是函数式编程里的特性之一,允许函数作为参数传递,也允许函数作为返回值来返回)
Scala创始人 Martin Odersky马丁·奥德斯基
Martin是EPFL(瑞士领先的技术大学,洛桑联邦理工学院)编程研究组的教授。他在整个职业生涯中一直不断追求着一个目标:让写程序这样一个基础工作变得高效、简单、且令人愉悦。
他可能比世界上任何一个人写过更多的Java和Scala代码。他编写了javac,这是目前大部分Java程序员所使用的编译器。他也编写了Scala编译器scalac,可谓是Scala社区飞速发展的基石。他著有《Programming in Scala》一书,是最畅销的Scala书籍。他曾经就职于IBM研究院、耶鲁大学、卡尔斯鲁厄大学以及南澳大利亚大学。在此之前,他在瑞士苏黎世联邦理工学院追随Pascal创始人Niklaus Wirth学习,并于1989年获得博士学位。
对于scala这门语言,有人把它当做Java的延伸版,有人把它当做JVM上的C++,有人觉得这是面向对象语言和面向函数语言的简单混合,有人觉得这就是Haskell,而且也还不如Haskell
强。(纯的面向函数式编程语言)
下图Martin Odersky马丁·奥德斯基(Scala的发明者,EPFL教授)在2016年夏天的Scala Day旧金山大会上发出了这张著名的玩笑照片:
这个图片上的翻译是:“Scala唯一的作用是将人引向Haskell”。马丁·奥德斯基以此作为一个笑话,说他该把Scala改一下名字,叫做Hascalator,还请人设计了一个Logo。
Scala并不适于编程的初级课程。相反,它是为专业程序员定制的强力语言。
1)它是一门现代编程语言,作者是Martin Odersky(javac之父),受到Java、Ruby、Smalltalk、ML、Haskell、Erlang等语言的影响。
2)它即是一门面向对象(OOP)语言,每个变量都是一个对象,每个“操作符”都是方法。scala语言在面向对象的方面,要比java更彻底。
它同时也是一门函数式编程(FP)语言,可以将函数作为参数传递。你可以用OOP、FP,或者两者结合的方式编写代码。
3)Scala代码通过scalac编译成.class文件,然后在JVM上运行,可以无缝使用已有的丰富的Java类库。即Scala的代码会编译成字节码,运行在Java虚拟机(JVM)上。
4)接触语言的第一天你就能编出有趣的程序,但是这门语言很深奥,随着学习的深入,你会发现更新、更好的编写代码的方式。Scala会改变你对编程的看法。针对同一任务,可以有很多种不同的实现方式,并且可读性以及性能都有不一样的体现。
scala编程的一个示例:
Array(1,2,3,4)
如何遍历数组中的元素,你应该这么做:
for (i <- Array(1,2,3,4)) println(i)
Array(1,2,3,4).foreach{print(_)}
如果尝试将这些元素转换为新的集合,应该使用for/yield表达式或者map方法:
scala> for (i <- Array(1,2,3)) yield i * 2 res0: Array[Int] = Array(2, 4, 6)
scala> Array(1,2,3).map(_ * 2)
res1: Array[Int] = Array(2, 4, 6)
比如过滤出一个集合中元素小于4的集合,你可以使用filter方法:
scala> val nums = List(1,2,3,4,5).filter(_ < 4)
res2: nums: List[Int] = List(1, 2, 3)
Scala相较于Java而言,则是相信程序员的优化能力。马丁·奥德斯基说:“很多程序员会告诉我,他们一般会重构他们的Scala代码两三次,甚至三四次。”这听起来似乎非常的没有效 率,但Scala就是这样的语言,每一次重构,代码的性能或者是可读性都会有极高的提升。
Scala不把程序员当傻子。马丁·奥德斯基对于scalca的定位很清楚:“Scala现在是为聪明人创造的,以后也是为聪明人服务的。"
Scala提供一整套工具,让程序员自由选择,无论是mutable数据结构,immutable数据结构,并行(parallel)数据结构。然后在这些选择中,Scala再针对他们进行算法层面的特殊优
化。Scala相信程序员的聪明才智,让程序员自行选择合适的结构,以针对变化万千的任务需求,这点是Scala做得极好的地方。
scala不是一门纯的函数式编程语言,所以有别纯函数式语言的区别之一是:scala提供变量和常量,而纯函数式编程语言是没有变量这概念的。
之前就有人提到过,Scala新手和老手写出来的代码完全会呈现两种不同的风格,甚至新人根 本不能读懂有经验的Scala程序员所写的代码,有人于是戏称:“太好了,这样的话我们部门 的实习生就不能乱碰我写的代码啦!”但其实不仅风格不同,执行效率差距也一定是巨大的。
kafka - scala - 分布式消息队列,内部代码经常用来处理并发的问题,用scala可以大大简化其代码。
spark - scala - 处理多线程场景方便,另外spark主要用作内存计算,经常要用来实现复杂的算法。利用scala这种函数式编程语言可以大大简化代码。
注:本教例仅列举一部分
函数式编程是一种编程范式,我们常见的编程范式有:
1)命令式编程(Imperative programming),常见的面向对象编程是也是一种命令式编程。比如java,c等。
命令式编程是完全依托于冯诺依曼体系机来实现的,即代码最后会转变为一条条的指令去执 行,所以指令式编程的时间复杂度是和指令数相关的。根据摩尔定律,冯诺依曼体系机的性能可能本世纪30年代就不再提高,即当冯诺依曼体系机被淘汰时,指令式编程可能也会被淘汰。现在有一个名字就是:冯诺依曼瓶颈,即内存的速度跟不上cpu处理速度。IBM TrueNorth。
2)函数式编程,从理论上来说,函数编程是不依托于指令架构的,因为函数式编程是建立主体和主体之间的映射关系。但是目前从实际情况来开,函数式编程还是需要转变为指令去运行的。
函数式编程语言:HasKell,K#,Lisp
3)逻辑式编程,最常用的逻辑编程语言是Prolog,另外有较适用于大型方案的Mercury。
在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。这个概念就是——高阶函数,高阶函数就是参数 为函数或返回值为函数的函数。有了高阶函数,就可以将复用的粒度降低到函数级别,相对于面向对象语言,复用的粒度更低。
此外,函数式语言通常提供非常强大的集合类(Collection),提供很多高阶函数,因此使用非常方便。
函数式编程语言还提供惰性求值(Lazy evaluation,也称作call-by-need),是在将表达式赋值给变量(或称作绑定)时并不计算表达式的值,而在变量第一次被使用时才进行计算。这样就可以通过避免不必要的求值提升性能。
纯函数式编程语言中的变量的值是不可变的(immutable),也就是说不允许像命令式编程语言中那样多次给一个变量赋值。比如说在命令式编程语言我们写“x = x + 1”,这依赖可变状态的事实,拿给程序员看说是对的,但拿给数学家看,却被认为这个等式为假。
实现步骤:
1)双击运行安装
2)添加scala安装目录的bin目录路径到系统环境变量中
编译模式
5)也可以先编写 ***.scala文件,通过执行文件来执行命令,比如: 先在e盘下创建一个hello.scala文件
print(“hello scala”);
6)也可以先生成 .scala文件,再编译生成 .class 文件,再执行。
在e盘下,创建demo01.scala文件,内容如下:
object Person{
def main(args: Array[String]):
Unit = { println("hello scala hello world~") }
}
在e盘路径下进入cmd命令窗口
然后执行:scalac demo01.scala
运行得到结果