SlideShare a Scribd company logo
Sparkle
大纲

Scala是什么

语法(特色)

类库和工具

缺点
Scala是什么
"Which Programming Language would you use *now*
  on top of JVM, except Java?". The answer was
     surprisingly fast and very clear: - Scala.




               http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming
I can honestly say if someone had shown me
   theProgramming in Scala book by by Martin
Odersky, Lex Spoon & Bill Venners back in 2003 I'd
      probably have never created Groovy.




                  http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html
Scala是……
Scala是……

又一个JVM上的语言(编译)
Scala是……

又一个JVM上的语言(编译)

强类型
Scala是……

又一个JVM上的语言(编译)

强类型

“动态的”静态语言
Scala是……

又一个JVM上的语言(编译)

强类型

“动态的”静态语言

函数式
Scala是……

又一个JVM上的语言(编译)

强类型

“动态的”静态语言

函数式

面向对象
谁在用


Twitter

LinkedIn

FourSquare

Xerox、Sony、Siemens
语法(特色)
Hello world!

  object Test {
  ! def main(args: Array[String]) {
  ! ! println("Hello, world!")
  ! }
  }
Hello world!

没有分号
         object Test {
         ! def main(args: Array[String]) {
         ! ! println("Hello, world!")
         ! }
         }
Hello world!

没有分号
         object Test {
定义后置
         ! def main(args: Array[String]) {
         ! ! println("Hello, world!")
         ! }
         }
Hello world!

没有分号
           object Test {
定义后置
           ! def main(args: Array[String]) {
           ! ! println("Hello, world!")
object     ! }
           }
Hello world!

没有分号
           object Test {
定义后置
           ! def main(args: Array[String]) {
           ! ! println("Hello, world!")
object     ! }
           }
def
Hello world!

没有分号
            object Test {
定义后置
            ! def main(args: Array[String]) {
            ! ! println("Hello, world!")
object      ! }
            }
def

println
Hello world!
  object Test extends Application {
  ! println("Hello, world!")
  }
Hello world!
            object Test extends Application {
            ! println("Hello, world!")

extends
            }
Hello world!
            object Test extends Application {
            ! println("Hello, world!")

extends
            }

类内直接写代码
简化
简化
val i = 1.2.toInt
简化
val i = 1.2.toInt
val list = List(1, 2, 3)
简化
val i = 1.2.toInt
val list = List(1, 2, 3)

val map = Map("Guangzhou" -> "GZ",
"Shenzhen" -> "SZ")
简化
val i = 1.2.toInt
val list = List(1, 2, 3)

val map = Map("Guangzhou" -> "GZ",
"Shenzhen" -> "SZ")
class MyClass(x: Int, y: Int) {}
简化
val i = 1.2.toInt
val list = List(1, 2, 3)

val map = Map("Guangzhou" -> "GZ",
"Shenzhen" -> "SZ")
class MyClass(x: Int, y: Int) {}
list.exists(_ == 2) //true
简化
val i = 1.2.toInt
val list = List(1, 2, 3)

val map = Map("Guangzhou" -> "GZ",
"Shenzhen" -> "SZ")
class MyClass(x: Int, y: Int) {}
list.exists(_ == 2) //true
val (a, b, _) = (x, y, z)
函数式编程
函数式编程

list.filter(e => e % 2 == 0)
函数式编程

list.filter(e => e % 2 == 0)

list.filter(_ % 2 == 0)
函数式编程

list.filter(e => e % 2 == 0)

list.filter(_ % 2 == 0)

val f = (e: Int) => e % 2 == 0

list.filter(f)
open class(ruby)
class String
 def foo
 "foo"
 end
end
puts "".foo # prints "foo"
为什么我们需要open class
为什么我们需要open class

  StringUtils.isBlank("some str")
为什么我们需要open class

  StringUtils.isBlank("some str")

        "some str".isBlank
为什么我们需要open class

  StringUtils.isBlank("some str")

        "some str".isBlank

  myObj should not contains(13)
隐式转换
class MyString(str: String) {
  def isBlank = str.trim.length == 0
}
implicit def myStringWrapper(str: String) = new
MyString(str)

println("some str".isBlank)
隐式转换
class MyString(str: String) {
  def isBlank = str.trim.length == 0
}
implicit def myStringWrapper(str: String) = new
MyString(str)

println("some str".isBlank)

      println(new MyString("some str").isBlank)
open class的效果让大家觉得Scala是动态语言,但选择
  隐式转换来实现,正好证明了Scala是静态语言
Trait
  class Animal { xxx }
  trait CanFly {
    def fly {
      println("fly")
    }
  }
  class Bird extends Animal
    with CanFly {}
Trait
              class Animal { xxx }
              trait CanFly {
Mixin,类似多集成     def fly {
                  println("fly")
接口和实现一起出现       }
              }
是什么和拥有什么功能
              class Bird extends Animal
                with CanFly {}
Trait
class Fish { xxx }
trait CanFly {
  def fly {
    println("fly")
  }
}
val flyFish = new Fish with CanFly
Actors
val myActor = actor {
  loop {
    react {
      case "Send" => {
        println("Get")
      }
    }
  }
}
myActor ! "Send"
模式匹配
def matchTest(x: Any) = x match {
  case 1 => "number one"
  case y: Int if y > 0 => y + 1
  case head :: tail => tail
  case Send(a, _) => a
  case ("Send", _, b: String) => b
  case _ => x
}
XML支持


println(<date>{new java.util.Date()}</date>)
并发
是什么让我们觉得一个语言是并发的语言
是什么让我们觉得Go和Erlang是并发语
   言,而C++和Python不是
是什么让我们觉得Go和Erlang是并发语
    言,而C++和Python不是




 Go内置Channel和Goroutine

 Erlang的一次赋值、轻量级进程
是什么让我们觉得Scala

val

case class

模式匹配

大量的immutable类

Actors
与Java互相调用


Scala能调用绝大部分的Java

JavaConverters、JavaConversions

Java调用Scala独有的东西比较困难
类库和工具
Lift



full stack

view first
Play!



Play Scala
Play!



Play Scala

Play 2.0 !!
Akka


STM & Transactors

Fault-tolerance

Transparent Remoting

Scala & Java API
sbt



构建工具
更多

Xitrum

Scalatra、Scalate

ScalaTest、specs2

Squeryl
IDE支持
缺点
It took about 15 hours to recreate the publishing
daemon in Clojure and get it to pass all our tests.
   Today we ran a "soak test" publishing nearly
300,000 profiles in one run. The Scala code would
fail with OoM exceptions if we hit it with 50,000
        profiles in one run (sometimes less).


                http://groups.google.com/group/clojure/browse_thread/thread/b18f9006c068f0a0
The e-mail confirms that Yammer is moving its basic
infrastructure stack from Scala back to Java, owing
     to issues with complexity and performance.




                              http://www.infoq.com/news/2011/11/yammer-scala
flatMap [B, That] (f: (A)   Traversable[B])(implicit bf:
        CanBuildFrom[List[A], B, That]) : That




                                http://goodstuff.im/yes-virginia-scala-is-hard
jetbrains出了新JVM语言Kotlin后,Scala社区终于                                                始
         正视Scala太                杂的问题了




            http://groups.google.com/group/scalacn/browse_thread/thread/cbbe5997009db919
缺点

编译速度

二进制不兼容

语法越来越   杂

太少人使用,招聘    发人员的问题
始使用
始使用

使用最新版(2.9.1)
始使用

使用最新版(2.9.1)

先   用高级特性
始使用

使用最新版(2.9.1)

先   用高级特性

小工具、单元测试
始使用

使用最新版(2.9.1)

先   用高级特性

小工具、单元测试

Java/Scala混合项目,逐步   移
始使用

使用最新版(2.9.1)

先     用高级特性

小工具、单元测试

Java/Scala混合项目,逐步   移

sbt
谢谢


weibo&twitter: @sparklezeng

email: popeast@gmail.com

website: http://weavesky.com

More Related Content

PPT
Scala
deathxlent
 
PDF
千呼萬喚始出來的 Java SE 7
Justin Lin
 
PDF
Java8 lambda
koji lin
 
PDF
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
PPTX
Reactive X 响应式编程
Jun Liu
 
PPTX
Ecma script edition5-小试
lydiafly
 
PPTX
保哥線上講堂:LINQ 快速上手
Will Huang
 
PDF
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
 
Scala
deathxlent
 
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Java8 lambda
koji lin
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
Reactive X 响应式编程
Jun Liu
 
Ecma script edition5-小试
lydiafly
 
保哥線上講堂:LINQ 快速上手
Will Huang
 
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
 

What's hot (20)

PPTX
Javascript share
Xu Mac
 
PDF
如何在 Java App 中導入 Scala
javatwo2011
 
PDF
functional-scala
wang hongjiang
 
PDF
Java 開發者的函數式程式設計
Justin Lin
 
PPTX
TypeScript 綜合格鬥技
Will Huang
 
PPT
Sun java
softwaredesigner
 
PPT
Scala function-and-closures
wang hongjiang
 
PDF
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Johnny Sung
 
PPTX
ES5 introduction
otakustay
 
PDF
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
PDF
Use Lambdas in Android
koji lin
 
PDF
Ecmascript
jay li
 
PDF
潜力无限的编程语言Javascript
jay li
 
PDF
Scala
勇浩 赖
 
PDF
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Justin Lin
 
PPT
Java7 fork join framework and closures
wang hongjiang
 
PDF
Java 8 與 retrolambda
Justin Lin
 
PPT
页游开发中的 Python 组件与模式
勇浩 赖
 
PDF
OpenEJB - 另一個選擇
Justin Lin
 
PDF
论 Python 与设计模式。
勇浩 赖
 
Javascript share
Xu Mac
 
如何在 Java App 中導入 Scala
javatwo2011
 
functional-scala
wang hongjiang
 
Java 開發者的函數式程式設計
Justin Lin
 
TypeScript 綜合格鬥技
Will Huang
 
Scala function-and-closures
wang hongjiang
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Johnny Sung
 
ES5 introduction
otakustay
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
Use Lambdas in Android
koji lin
 
Ecmascript
jay li
 
潜力无限的编程语言Javascript
jay li
 
Scala
勇浩 赖
 
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Justin Lin
 
Java7 fork join framework and closures
wang hongjiang
 
Java 8 與 retrolambda
Justin Lin
 
页游开发中的 Python 组件与模式
勇浩 赖
 
OpenEJB - 另一個選擇
Justin Lin
 
论 Python 与设计模式。
勇浩 赖
 
Ad

Viewers also liked (18)

PDF
Знакомьтесь, Kotlin
Tech Talks @NSU
 
PPTX
Scala Day by Day
Ionut Andonescu
 
PPTX
Android opetuksessa 11.9.14
Matleena Laakso
 
PDF
20140531 serebryany lecture01_fantastic_cpp_bugs
Computer Science Club
 
PDF
Kotlin Overview
Silicon Straits
 
PPTX
Intro to kotlin
Tomislav Homan
 
PDF
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum
 
PPT
Do Languages Matter?
Bruce Eckel
 
PDF
Kotlin в production. Как и зачем?
DotNetConf
 
PDF
Programming in scala - 1
Mukesh Kumar
 
PDF
Kotlin advanced - language reference for android developers
Bartosz Kosarzycki
 
PDF
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
Leonardo Zanivan
 
PDF
Kotlin: Why Do You Care?
intelliyole
 
PDF
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
Iosif Itkin
 
PPTX
Scala in practice
Tomer Gabel
 
PPTX
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
Provectus
 
PDF
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Andrey Breslav
 
PDF
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
Знакомьтесь, Kotlin
Tech Talks @NSU
 
Scala Day by Day
Ionut Andonescu
 
Android opetuksessa 11.9.14
Matleena Laakso
 
20140531 serebryany lecture01_fantastic_cpp_bugs
Computer Science Club
 
Kotlin Overview
Silicon Straits
 
Intro to kotlin
Tomislav Homan
 
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum
 
Do Languages Matter?
Bruce Eckel
 
Kotlin в production. Как и зачем?
DotNetConf
 
Programming in scala - 1
Mukesh Kumar
 
Kotlin advanced - language reference for android developers
Bartosz Kosarzycki
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
Leonardo Zanivan
 
Kotlin: Why Do You Care?
intelliyole
 
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
Iosif Itkin
 
Scala in practice
Tomer Gabel
 
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
Provectus
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Andrey Breslav
 
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
Ad

Similar to Scala (20)

PPTX
Scala+spark 2nd
Yuanhang Wang
 
PPTX
Scala+RDD
Yuanhang Wang
 
PPTX
Groovy:Candy for Java Developers
foxgem
 
PPTX
Groovy Introduction for Java Programmer
Li Ding
 
PDF
Clojure and FP
Qin Jian
 
PPT
Groovy简介
profeter
 
PPTX
Clojure的魅力
dennis zhuang
 
PDF
Swift 程序语言介绍
明 李
 
KEY
Ruby basic
xiaozhestrong
 
PPT
Hi Haskell
Jifeng Deng
 
PDF
使用Dsl改善软件设计
mingjin
 
PPTX
Scala分享第二期
Tony Deng
 
PDF
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
Dahui Feng
 
PDF
Clojure简介与应用
Robert Hao
 
PDF
Java Jdk6学习笔记[Ppt]
yiditushe
 
DOC
Java面试笔试题大汇总
yiditushe
 
PPTX
为什么要学Python
Depeng Cong
 
PDF
JVM上的实用Lisp方言:Clojure
Rui Peng
 
DOC
Free Marker中文文档
yiditushe
 
PDF
Ruby基础培训
xiaozhestrong
 
Scala+spark 2nd
Yuanhang Wang
 
Scala+RDD
Yuanhang Wang
 
Groovy:Candy for Java Developers
foxgem
 
Groovy Introduction for Java Programmer
Li Ding
 
Clojure and FP
Qin Jian
 
Groovy简介
profeter
 
Clojure的魅力
dennis zhuang
 
Swift 程序语言介绍
明 李
 
Ruby basic
xiaozhestrong
 
Hi Haskell
Jifeng Deng
 
使用Dsl改善软件设计
mingjin
 
Scala分享第二期
Tony Deng
 
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
Dahui Feng
 
Clojure简介与应用
Robert Hao
 
Java Jdk6学习笔记[Ppt]
yiditushe
 
Java面试笔试题大汇总
yiditushe
 
为什么要学Python
Depeng Cong
 
JVM上的实用Lisp方言:Clojure
Rui Peng
 
Free Marker中文文档
yiditushe
 
Ruby基础培训
xiaozhestrong
 

Scala

Editor's Notes