Contenu connexe
Similaire à 如何在 Java App 中導入 Scala (20)
如何在 Java App 中導入 Scala
- 2. About Me
• 許洛豪 (BrianHsu)
• 經歷
– 華寶通訊 Android 手機工程師
– 中研院數位典藏成果入口網技術發展組
• 演講
– OSDC.tw 2010
– COSCUP 2010
2
- 3. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
3
- 4. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
4
- 5. Scala 是什麼?
• 執行在 JVM 上的程式語言
• 靜態型別的語言
• 支援物件導向及 Functional Programming
的多典範程式語言
5
- 6. Scala 的特色
• 設計上就不把 Java 語法相容考慮進去
• 靜態/強型別的 JVM 程式語言
– vs Grovvy/JRuby/Clojure...etc.
• 編譯式的程式語言
– 編譯成 JVM Bytecode
– 也就是 .class 檔
• 提供 REPL / Script 模式
6
- 7. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
7
- 8. 簡單省事
Java 討人厭的地方都被修正了
8
- 13. Scala 的特異功能
• Singleton
• Tuple
• Case Class
• Operator is Method
• Pattern Matching
• Collection / High-order Function / Closure
• Trait
13
- 27. Trait
• 沒有實作任何 Method 的 Trait
– 等價於 Java 的 Interface
• 有實作的 Trait
27
- 29. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
29
- 30. What could I do?
• Java Legacy Code
– REPL 實驗
• Unit Test
– ScalaTest (http://www.scalatest.org/)
• Prototyping
30
- 31. Java / Scala 混合專案流程
Java 原始檔 Java 編譯器
Java .class
Bytecode 檔案
Java
執行 JAR 檔
Virtual Machine
31
- 32. Java / Scala 混合專案流程
Java 原始檔 Java 編譯器 Scala 原始檔
Java .class
Bytecode 檔案 Scala 編譯器
Java
執行 JAR 檔
Virtual Machine
32
- 34. Scala/Java 相互參照
1.scalac -d classes/ iis/*.java iis/*.scala
2.javac -cp 'classes/:/usr/share/scala/lib/*' -d
classes/ iis/*.java
34
- 35. IDE Tools
• Scala IDE for Eclipse
– http://www.scala-ide.org/
• IntelliJ IDEA
– http://www.jetbrains.com/idea/
35
- 36. Command Line Tool
• SBT (Simple Build Tool)
– http://code.google.com/p/simple-build-tool
– 類似 Maven/Ant ,但和 XML 說再見
– 可以使用 Maven Repository 裡的函式庫
– 自動處理相依性和 Java/Scala 混合編譯的問題
36
- 39. SBT Commands
• reload
• update
• compile
• run
• console
• test
• exit
39
- 40. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
40
- 49. BeanProperty Annotation
• 自動產生 JavaBean 的 Getter / Setter
• scala.reflect package
– @BeanProperty
• getXXXX()
• setXXXX()
– @BooleanBeanProperty
• IsXXXX()
• setXXXX()
49
- 51. Java Static Protected Member
• Scala 沒有 static 的概念
• 所有的函式/成員必定屬於某個特定物件
– Singleton 物件
• 語意無法表達 protected static 成員
51
- 56. Type Inference
• Scala 的 Type Inference 並不完美
– 特別是在泛型和處理基本資料型態時
– 可以使用 .asInstanceOf[T] 來強制轉型
• 例:
– (1.5).asInstanceOf[java.lang.Double]
– 1.asInstanceOf[java.lang.Integer]
56
- 59. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
59
- 62. Tools
• scalac -print
– 將 Scala 的特殊語法轉成 Java 可表達的語法
– 例如:將 Pattern Matching 轉成 if/else
• javap
– 因為 Scala 編譯出的是標準的 JVM
Bytecode ,可以使用此程式觀看 Scala 產出的
.class 檔的結構
62
- 67. Tuple
• 總共有 N 個類別
– scala.Tuple2[T1, T2]
– scala.Tuple3[T1, T2, T3]
– ….
• 唯讀的 Immutable Object
• 可以直接在 Java 中使用
– 基本資料型態以 java.lang.Object 做為 T
67
- 71. High-Order Function
• 一樣有 N 個 Trait
– scala.Function1[T1, R]
– scala.Function2[T1, T2, R]
– ….
• 類別中的 apply(T1 v1, T2 v2) 方法即為
函式主體
71
- 72. High-Order Function
• 於 Java 中使用
– scala.runtime.AbstractFunctionN
– 覆寫 apply() 方法
– 基本資料型態改用 Object 做型態參數
72
- 75. Operator Overloading
• Scala 中的 Method 可以用 Operator 當做
名稱,以此達成 Operator Overloading
• Java / JVM 中的 Identifier 名稱規範
– Scala 在編譯時期將 Operator 轉成符合 JVM
規範的 Identifier
– 使用 javap 可以看實際上該 Method 的名稱
75
- 80. Agenda
• Scala 是什麼?
• 為什麼使用 Scala ?
• Java / Scala 混合專案流程與工具
• Call Java from Scala
• Call Scala from Java
• Conclusion
80
- 81. Conclusion
• Scala 可以幫助你更快地開發程式
• Scala 可以幾乎是無痛地整合至 Java 程式
• 特別適合用在以下兩種狀況
– Unit Test
– Prototyping
81