Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

如何在 Java App 中導入 Scala

3,397 views

Published on

Scala 是一套結合了物件導向與 Function Programming 典範的程式語言,在實作
方面則建構在 JVM 平台之上,將其原始碼編譯成 JVM Bytecode 並由 JVM 執行。
由於這個原因,Scala 與 Java 擁有相當高的 interoperability,在這個講題中
我們會介紹如何透過這樣的特性,將 Scala 導入原本使用 Java 實作的專案,以
及相關的小技巧。

Published in: Technology, News & Politics

如何在 Java App 中導入 Scala

  1. 1. 如何在 Java App 中導入 Scala Brian Hsu
  2. 2. About Me• 許洛豪 (BrianHsu)• 經歷 – 華寶通訊 Android 手機工程師 – 中研院數位典藏成果入口網技術發展組• 演講 – OSDC.tw 2010 – COSCUP 20102
  3. 3. Agenda• Scala 是什麼?• 為什麼使用 Scala ?• Java / Scala 混合專案流程與工具• Call Java from Scala• Call Scala from Java• Conclusion3
  4. 4. Agenda• Scala 是什麼?• 為什麼使用 Scala ?• Java / Scala 混合專案流程與工具• Call Java from Scala• Call Scala from Java• Conclusion4
  5. 5. Scala 是什麼?• 執行在 JVM 上的程式語言• 靜態型別的語言• 支援物件導向及 Functional Programming 的多典範程式語言5
  6. 6. Scala 的特色• 設計上就不把 Java 語法相容考慮進去• 靜態/強型別的 JVM 程式語言 – vs Grovvy/JRuby/Clojure...etc.• 編譯式的程式語言 – 編譯成 JVM Bytecode – 也就是 .class 檔• 提供 REPL / Script 模式6
  7. 7. Agenda• Scala 是什麼?• 為什麼使用 Scala ?• Java / Scala 混合專案流程與工具• Call Java from Scala• Call Scala from Java• Conclusion7
  8. 8. 簡單省事 Java 討人厭的地方都被修正了8
  9. 9. Scala 幫你省事的部份• Everything is Object• Type Inference• Unchecked Exception9
  10. 10. Everything is Object10
  11. 11. Type Inference11
  12. 12. Unchecked Exception12
  13. 13. Scala 的特異功能 • Singleton • Tuple • Case Class • Operator is Method • Pattern Matching • Collection / High-order Function / Closure • Trait13
  14. 14. Singleton14
  15. 15. Tuple15
  16. 16. Tuple16
  17. 17. Case Class17
  18. 18. Operator is Method18
  19. 19. Operator is Method19
  20. 20. Pattern Matching20
  21. 21. Pattern Matching21
  22. 22. Pattern Matching22
  23. 23. Collection23
  24. 24. High-Order Function / Closure24
  25. 25. Trait • 貓狗魚鳥都是動物,但可以做不同的動作 – 四種都會吃東西 – 貓和狗會走路 – 魚會游泳但不會走路也不會飛 – 鳥會走路、會飛但不會游泳25
  26. 26. Java Interface26
  27. 27. Trait • 沒有實作任何 Method 的 Trait – 等價於 Java 的 Interface • 有實作的 Trait27
  28. 28. Trait28
  29. 29. Agenda • Scala 是什麼? • 為什麼使用 Scala ? • Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion29
  30. 30. What could I do? • Java Legacy Code – REPL 實驗 • Unit Test – ScalaTest (http://www.scalatest.org/) • Prototyping30
  31. 31. Java / Scala 混合專案流程 Java 原始檔 Java 編譯器 Java .class Bytecode 檔案 Java 執行 JAR 檔 Virtual Machine31
  32. 32. Java / Scala 混合專案流程 Java 原始檔 Java 編譯器 Scala 原始檔 Java .class Bytecode 檔案 Scala 編譯器 Java 執行 JAR 檔 Virtual Machine32
  33. 33. Scala/Java 相互參照33
  34. 34. Scala/Java 相互參照 1.scalac -d classes/ iis/*.java iis/*.scala 2.javac -cp classes/:/usr/share/scala/lib/* -d classes/ iis/*.java34
  35. 35. IDE Tools • Scala IDE for Eclipse – http://www.scala-ide.org/ • IntelliJ IDEA – http://www.jetbrains.com/idea/35
  36. 36. Command Line Tool • SBT (Simple Build Tool) – http://code.google.com/p/simple-build-tool – 類似 Maven/Ant ,但和 XML 說再見 – 可以使用 Maven Repository 裡的函式庫 – 自動處理相依性和 Java/Scala 混合編譯的問題36
  37. 37. Project Layout 不在 Maven 裡的 JAR 檔 Java 原始碼 Scala 原始碼 Unit Test37
  38. 38. Maven Repository • project/build/TestProject.scala38
  39. 39. SBT Commands • reload • update • compile • run • console • test • exit39
  40. 40. Agenda • Scala 是什麼? • 為什麼使用 Scala ? • Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion40
  41. 41. Accessing Java Code Base • Scala 可以直接使用絕大多數的 Java 程式 • 預設 Import – java.lang.*41
  42. 42. Accessing Java Code Base42
  43. 43. Java ↔ Scala Collection43
  44. 44. Java ↔ Scala Collection44
  45. 45. Implicit Conversions45
  46. 46. Implicit Conversions46
  47. 47. Implicit Conversion47
  48. 48. 剩下的一小部份48
  49. 49. BeanProperty Annotation • 自動產生 JavaBean 的 Getter / Setter • scala.reflect package – @BeanProperty • getXXXX() • setXXXX() – @BooleanBeanProperty • IsXXXX() • setXXXX()49
  50. 50. BeanProperty Annotation50
  51. 51. Java Static Protected Member • Scala 沒有 static 的概念 • 所有的函式/成員必定屬於某個特定物件 – Singleton 物件 • 語意無法表達 protected static 成員51
  52. 52. Java Static Protected Member52
  53. 53. Java Static Protected Member53
  54. 54. Java Static Protected Member54
  55. 55. Java Static Protected Member55
  56. 56. Type Inference • Scala 的 Type Inference 並不完美 – 特別是在泛型和處理基本資料型態時 – 可以使用 .asInstanceOf[T] 來強制轉型 • 例: – (1.5).asInstanceOf[java.lang.Double] – 1.asInstanceOf[java.lang.Integer]56
  57. 57. Raw Types57
  58. 58. Raw Types58
  59. 59. Agenda • Scala 是什麼? • 為什麼使用 Scala ? • Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion59
  60. 60. 沒有用到 Scala 特異功能的都可以直接使用60
  61. 61. Accessing Scala Code Base61
  62. 62. Tools • scalac -print – 將 Scala 的特殊語法轉成 Java 可表達的語法 – 例如:將 Pattern Matching 轉成 if/else • javap – 因為 Scala 編譯出的是標準的 JVM Bytecode ,可以使用此程式觀看 Scala 產出的 .class 檔的結構62
  63. 63. Singleton Object63
  64. 64. Singleton Object64
  65. 65. Singleton Object65
  66. 66. Singleton Object66
  67. 67. Tuple • 總共有 N 個類別 – scala.Tuple2[T1, T2] – scala.Tuple3[T1, T2, T3] – …. • 唯讀的 Immutable Object • 可以直接在 Java 中使用 – 基本資料型態以 java.lang.Object 做為 T67
  68. 68. Tuple68
  69. 69. Tuple69
  70. 70. Tuple70
  71. 71. High-Order Function • 一樣有 N 個 Trait – scala.Function1[T1, R] – scala.Function2[T1, T2, R] – …. • 類別中的 apply(T1 v1, T2 v2) 方法即為 函式主體71
  72. 72. High-Order Function • 於 Java 中使用 – scala.runtime.AbstractFunctionN – 覆寫 apply() 方法 – 基本資料型態改用 Object 做型態參數72
  73. 73. High-Order Function73
  74. 74. High-Order Function74
  75. 75. Operator Overloading • Scala 中的 Method 可以用 Operator 當做 名稱,以此達成 Operator Overloading • Java / JVM 中的 Identifier 名稱規範 – Scala 在編譯時期將 Operator 轉成符合 JVM 規範的 Identifier – 使用 javap 可以看實際上該 Method 的名稱75
  76. 76. Operator Overloading76
  77. 77. Operator Overloading77
  78. 78. Trait78
  79. 79. Trait79
  80. 80. Agenda • Scala 是什麼? • 為什麼使用 Scala ? • Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion80
  81. 81. Conclusion • Scala 可以幫助你更快地開發程式 • Scala 可以幾乎是無痛地整合至 Java 程式 • 特別適合用在以下兩種狀況 – Unit Test – Prototyping81
  82. 82. Thanks! Enjoy Programming!82

×