SlideShare una empresa de Scribd logo
1 de 17
SCALA —— JAVA王座的继承人 吴永照
我将始终爱着你 …… 在最近五年中,对 Java 语言的不满情绪逐渐增多。不少Java开发人员转向其它语言阵营,如Ruby… James Gosling: Java是一个令人惊讶的复杂语言表现在它的自动装箱原生类型,讨厌的数组(它们不是collection,而且由于缺少多态性,对于通用数据结构和bean特性需要很冗繁的 语法,并且仍然没有闭包(即使在JDK7中),导致了大量令人烦躁的try/catch/finally的语句,除非你使用包含了全新自定义API的架 构,但是这样会导致语言更加复杂。Java甚至有类型引用,不过我们还是不要使用它来存储任何typing/reading。 简单地说,Java 编程略显老态了。 或者,更准确地说,Java 语言 略显老态了 谁将是java的继任者?
Scala与Groovy Scala和Groovy都是基于JVM的语言,相比Java都有更加简明的语法和丰富的表达能力。 对于那些既想不脱离开JVM又想避免Java繁琐的语句的开发人员来说,Scala和Groovy都是不错的选择。可是选择哪一个才能在未来发展过程中取得先机呢?哪一个是未来发展的方向呢?这些都是困扰开发者的难题。 Scala和Groovy之间的核心区别在于前者是静态类型的。 有些人可能争辩说这使得达到脚本化目标变得更加复杂了,而脚本化正是Groovy的动机。然而,Scala有完整的体系特征,这使Groovy看上去更像个玩具。比如,Scala有“sequence comprehensions”。该要素导致对算法的表述非常紧凑和强大。 Scala还有更多被证明是非常有用的特性。 如嵌套类,currying和代数类型模式匹配。它还支持类似于JDK1.5 所增加的泛型和注解。这些还都只是冰山一角
Scala与Groovy
Scala与Java Scala比Java更简单: Scala的语言规范比Java更简单,因为一致性意味着更少的特殊情况 Array、泛型 Scala要解决的问题,Java同样面对,但Java解决的方式更复杂、更曲折-各种设计模式 函数、单例object、模式匹配 Scala的扩展性表现在通过类库来扩展语言能力,而不是加入更多的语法要素或改写编译器 Actors库、Packrat Parser库 更重要的是: Scala的一致性+扩展性会再次激发出程序员的创造力 但是 Scala本身的开发过程需要加强 更多的Java基本库被移植到Scala(比如nio库) 更多的Scala应用实例(比如liftweb) IDE的支持
何为scala 1、Scala是Scalable Laguage的缩写,意为可伸缩语言,是一种融合了面向对象和函数式编程的静态类型语言,被定位为构建组件及组件系统。 2、Martin Odersky教授在(瑞士)洛桑联邦理工学院( EPFL )的程序设计实验室从 2001 年开始研发 Scala 。他可能是 Java 社区中研究 Pizza 和 GJ 语言的最著名的人,GJ 是 Java 5 泛型的工作原型。 3、特性 它拥有基于事件的并发模型 它既支持命令式风格,也支持函数式风格 它是纯面向对象的 它可以很好的与java混合 它强制使用自适应静态类型
何为scala 4、站巨人肩膀上。Scala的设计受许多编程语言和研究思想的影响。 Scala采用了Java和C#语法的大部 统一对象模型是由Smalltalk发起的,之后又被Ruby发扬光大 通用嵌套的思想也出现在Algol,Simula,和最近的Beta与gbeta中 方法调用和字段选择的统一访问原则来自于Eiffel 函数式编程的处理方式在骨子里与以SML,OCaml和F#为代表的ML家族语言很接近 许多Scala标准库里面的高阶函数同样也出现在ML或Haskell中 隐式参数灵感激发自Haskell的类型类 基于行动类的并发库几乎全是Erlang的思想 5、Scala目前应用 脚本      web应用 消息 图形用户界面
为何选择scala 1、Scala是兼容的 Scala不需要你从Java平台后退两步然后跳到Java语言前面去。它被设计成无缝地与Java实施互操作,Scala程序会被编译为JVM的字节码。 2、Scala是简洁的  Scala程序一般都很短。与Java比起来代码行数可以减少到1/10。 在Java里  class MyClass {         private int index;         private String name;         public MyClass(int index, String name) {  this.index = index; this.name = name; } }  在Scala里  class MyClass(index: Int, name: String)
为何选择scala 3、Scala是高层级的  Scala可以通过提升设计和使用的接口的抽象级别来帮助程序员管理复杂性。 设你有一个String变量name,你想弄清楚是否String包含一个大写字符。 // 在Java里  booleannameHasUpperCase = false;  for (int i = 0; i < name.length(); ++i) {       if (Character.isUpperCase(name.charAt(i))){  nameHasUpperCase= true; break;        } }  在Scala里,你可以写成:  valnameHasUpperCase = name.exists(_.isUpperCase)  明显Scala代码更短并且比Java代码更容易懂。因此Scala代码在通盘复杂度预算上能极度地变轻。它也更少给你机会犯错。
为何选择Scala 4、Scala是静态类型的  可检验属性。静态类型系统可以保证消除某些运行时的错误。 安全的重构。静态类型系统提供了让你具有高度信心改动代码基础的安全网。 文档。静态类型是被编译器检查过正确性的程序文档。 5、Scala是天生的并发语言 使用函数式编程风格,用不变状态(immutable state)编写无锁代码 Scala提供 一个基于actor的消息传递模型,消除涉及并发的痛苦问题,避免数据竞争。
一切值都是对象的实例 JVM中的原生类型是对象的实例 123.toByte "1".toInt true.toString 函数也是值,从而也是对象的实例 val compare = (x: Int, y: Int) => x > y compare(1, 2) // result: Boolean = false Java的static方法和域再没有存在的理由,因为它们的所有者也必须是对象的实例(值),所以有了Scala中的单例object object Dog { valwhatever = "dog" // static field in Java } class Dog { defcallWhatever = Dog.whatever }
函数作为值 可以当作参数传递 val compare = (x: Int, y: Int) => x > y list sortWith compare 不管它是实例的方法 class AComparator { 	def compare(x: Int, y: Int) = x > y } list sortWith (new AComparator).compare 还是匿名子句 object annonymous extends scala.Function2[Int, Int, Boolean] { 	override def apply(x: Int, y: Int) = x > y } list sortWithannonymous 没有了static域,一切函数,包括object的方法调用现在都是 值(实例)的方法
一切操作都是函数调用(1) 只有一个参数或零个参数的方法在调用时可以省略”.”和”()” 1.+(1) 1 + 1 1.>(0) 1 > 0 (1 > 0).&(2 > 1) (1 > 0) & 2 > 1 stack.push(10) stack push 10 stack.pop stack pop 参数也可以是一系列操作 {...} stack push { vala = 1 val b = 2 a + b } 更多的符号需要用作方法名 def !@#%^&*<=>?|~:/ = println("noop") def √(x: Double) = Math.sqrt(x) valΠ = Math.Pi val r = √(9*Π) ‘<’, ‘>’更适合作方法名,所以用’[’和‘]’来表示类型参数
一切操作都是函数调用(2) for语句是函数调用 for (i <- List(1, 2)) { println(i) } List(1, 2) foreach {i => println(i)} for (i <- List(1, 2)) yield { 	i + 10 } List(1, 2) map {i => i + 10} 更多的例子 // synchronized is function call instead of keyword def check = synchronized { // isInstanceOf is function call instead of keyword 100.isInstanceOf[String] } 额外的好处:自左向右顺序书写语句 stack.pop.asInstanceOf[Int] // (Integer) stack.pop() in Java
一切操作都返回值 默认返回最后一条语句的值,也可以用return显式返回 val r1 = { // return 3 vala = 1 valb = 2 	a + b } val r2 = if (true) 1 else 2 val r3 = // return (): Unit for (i <- List(1, 2)) { println(i) } val r4 = // return List(11, 12) for (i <- List(1, 2)) yield { 	i + 10 } val r5 = // return java.io.File try { valf = new File("afile") 	f } catch { 	case ex: IOException => null }
The End! thanks

Más contenido relacionado

Más de Tony Deng

一页纸项目管理
一页纸项目管理一页纸项目管理
一页纸项目管理Tony Deng
 
Docker at the gate
Docker at the gateDocker at the gate
Docker at the gateTony Deng
 
《我们如何工作》—质量保障
《我们如何工作》—质量保障《我们如何工作》—质量保障
《我们如何工作》—质量保障Tony Deng
 
《我们如何工作》- 产品经理和工程师如何有效沟通
《我们如何工作》- 产品经理和工程师如何有效沟通《我们如何工作》- 产品经理和工程师如何有效沟通
《我们如何工作》- 产品经理和工程师如何有效沟通Tony Deng
 
我们为何工作--找到正确的工作方式
我们为何工作--找到正确的工作方式我们为何工作--找到正确的工作方式
我们为何工作--找到正确的工作方式Tony Deng
 
一次Http请求过程分析
一次Http请求过程分析一次Http请求过程分析
一次Http请求过程分析Tony Deng
 
一次Code review引发的思考
一次Code review引发的思考一次Code review引发的思考
一次Code review引发的思考Tony Deng
 
My sql迁移总结
My sql迁移总结My sql迁移总结
My sql迁移总结Tony Deng
 
一次项目的探险旅程
一次项目的探险旅程一次项目的探险旅程
一次项目的探险旅程Tony Deng
 
Scrum敏捷开发模型
Scrum敏捷开发模型Scrum敏捷开发模型
Scrum敏捷开发模型Tony Deng
 
Shoutv 冯晓东
Shoutv 冯晓东Shoutv 冯晓东
Shoutv 冯晓东Tony Deng
 
技术债务的形成
技术债务的形成技术债务的形成
技术债务的形成Tony Deng
 
我们不了解的计算机世界(二)
我们不了解的计算机世界(二)我们不了解的计算机世界(二)
我们不了解的计算机世界(二)Tony Deng
 
我们不了解的计算机世界(一)--Unix目录结构的来历
我们不了解的计算机世界(一)--Unix目录结构的来历我们不了解的计算机世界(一)--Unix目录结构的来历
我们不了解的计算机世界(一)--Unix目录结构的来历Tony Deng
 
节约内存:Instagram的redis实践
节约内存:Instagram的redis实践节约内存:Instagram的redis实践
节约内存:Instagram的redis实践Tony Deng
 
晁盖与宋江的“兄弟情谊”
晁盖与宋江的“兄弟情谊”晁盖与宋江的“兄弟情谊”
晁盖与宋江的“兄弟情谊”Tony Deng
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5 Tony Deng
 

Más de Tony Deng (20)

一页纸项目管理
一页纸项目管理一页纸项目管理
一页纸项目管理
 
Docker at the gate
Docker at the gateDocker at the gate
Docker at the gate
 
《我们如何工作》—质量保障
《我们如何工作》—质量保障《我们如何工作》—质量保障
《我们如何工作》—质量保障
 
《我们如何工作》- 产品经理和工程师如何有效沟通
《我们如何工作》- 产品经理和工程师如何有效沟通《我们如何工作》- 产品经理和工程师如何有效沟通
《我们如何工作》- 产品经理和工程师如何有效沟通
 
我们为何工作--找到正确的工作方式
我们为何工作--找到正确的工作方式我们为何工作--找到正确的工作方式
我们为何工作--找到正确的工作方式
 
SDN介绍
SDN介绍SDN介绍
SDN介绍
 
一次Http请求过程分析
一次Http请求过程分析一次Http请求过程分析
一次Http请求过程分析
 
图解Git
图解Git图解Git
图解Git
 
一次Code review引发的思考
一次Code review引发的思考一次Code review引发的思考
一次Code review引发的思考
 
My sql迁移总结
My sql迁移总结My sql迁移总结
My sql迁移总结
 
一次项目的探险旅程
一次项目的探险旅程一次项目的探险旅程
一次项目的探险旅程
 
Scrum敏捷开发模型
Scrum敏捷开发模型Scrum敏捷开发模型
Scrum敏捷开发模型
 
Shoutv 冯晓东
Shoutv 冯晓东Shoutv 冯晓东
Shoutv 冯晓东
 
技术债务的形成
技术债务的形成技术债务的形成
技术债务的形成
 
我们不了解的计算机世界(二)
我们不了解的计算机世界(二)我们不了解的计算机世界(二)
我们不了解的计算机世界(二)
 
HBase
HBaseHBase
HBase
 
我们不了解的计算机世界(一)--Unix目录结构的来历
我们不了解的计算机世界(一)--Unix目录结构的来历我们不了解的计算机世界(一)--Unix目录结构的来历
我们不了解的计算机世界(一)--Unix目录结构的来历
 
节约内存:Instagram的redis实践
节约内存:Instagram的redis实践节约内存:Instagram的redis实践
节约内存:Instagram的redis实践
 
晁盖与宋江的“兄弟情谊”
晁盖与宋江的“兄弟情谊”晁盖与宋江的“兄弟情谊”
晁盖与宋江的“兄弟情谊”
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
 

Scala