如何在 Java App 中導入 Scala @ JavaTWO 2011

如何在 Java App 中導入 Scala @ JavaTWO 2011

Java / Scala interaction presentation @ JavaTwo 2011 Conference.

2377fa6c1b0f089b7e3229dfe2f6ae7f?s=128

Brian Hsu

July 29, 2011
Tweet

Transcript

  1. 如何在 如何在 Java App Java App 中導入 中導入 Scala Scala

    Brian Hsu Brian Hsu
  2. 2 About Me • 許洛豪 (BrianHsu) • 經歷 – 華寶通訊

    Android 手機工程師 – 中研院數位典藏成果入口網技術發展組 • 演講 – OSDC.tw 2010 – COSCUP 2010
  3. 3 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  4. 4 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  5. 5 Scala 是什麼? • 執行在 JVM 上的程式語言 • 靜態型別的語言 •

    支援物件導向及 Functional Programming 的多典範程式語言
  6. 6 Scala 的特色 • 設計上就不把 Java 語法相容考慮進去 • 靜態/強型別的 JVM

    程式語言 – vs Grovvy/JRuby/Clojure...etc. • 編譯式的程式語言 – 編譯成 JVM Bytecode – 也就是 .class 檔 • 提供 REPL / Script 模式
  7. 7 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  8. 8 簡單省事 Java 討人厭的地方都被修正了

  9. 9 Scala 幫你省事的部份 • Everything is Object • Type Inference

    • Unchecked Exception
  10. 10 Everything is Object

  11. 11 Type Inference

  12. 12 Unchecked Exception

  13. 13 Scala 的特異功能 • Singleton • Tuple • Case Class

    • Operator is Method • Pattern Matching • Collection / High-order Function / Closure • Trait
  14. 14 Singleton

  15. 15 Tuple

  16. 16 Tuple

  17. 17 Case Class

  18. 18 Operator is Method

  19. 19 Operator is Method

  20. 20 Pattern Matching

  21. 21 Pattern Matching

  22. 22 Pattern Matching

  23. 23 Collection

  24. 24 High-Order Function / Closure

  25. 25 Trait • 貓狗魚鳥都是動物,但可以做不同的動作 – 四種都會吃東西 – 貓和狗會走路 – 魚會游泳但不會走路也不會飛

    – 鳥會走路、會飛但不會游泳
  26. 26 Java Interface

  27. 27 Trait • 沒有實作任何 Method 的 Trait – 等價於 Java

    的 Interface • 有實作的 Trait
  28. 28 Trait

  29. 29 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  30. 30 What could I do? • Java Legacy Code –

    REPL 實驗 • Unit Test – ScalaTest (http://www.scalatest.org/) • Prototyping
  31. 31 Java / Scala 混合專案流程 Java Java 原始檔 原始檔 Java

    Java 編譯器 編譯器 Java .class Java .class Bytecode Bytecode 檔案 檔案 Java Java Virtual Machine Virtual Machine JAR JAR 檔 檔 執行 執行
  32. 32 Java / Scala 混合專案流程 Java Java 原始檔 原始檔 Java

    Java 編譯器 編譯器 Java .class Java .class Bytecode Bytecode 檔案 檔案 Java Java Virtual Machine Virtual Machine JAR JAR 檔 檔 執行 執行 Scala Scala 原始檔 原始檔 Scala Scala 編譯器 編譯器
  33. 33 Scala/Java 相互參照

  34. 34 Scala/Java 相互參照 1.scalac -d classes/ iis/*.java iis/*.scala 2.javac -cp

    'classes/:/usr/share/scala/lib/*' -d classes/ iis/*.java
  35. 35 IDE Tools • Scala IDE for Eclipse – http://www.scala-ide.org/

    • IntelliJ IDEA – http://www.jetbrains.com/idea/
  36. 36 Command Line Tool • SBT (Simple Build Tool) –

    http://code.google.com/p/simple-build-tool – 類似 Maven/Ant ,但和 XML 說再見 – 可以使用 Maven Repository 裡的函式庫 – 自動處理相依性和 Java/Scala 混合編譯的問題
  37. 37 Project Layout 不在 Maven 裡的 JAR 檔 Java 原始碼

    Scala 原始碼 Unit Test
  38. 38 Maven Repository • project/build/TestProject.scala

  39. 39 SBT Commands • reload • update • compile •

    run • console • test • exit
  40. 40 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  41. 41 Accessing Java Code Base • Scala 可以直接使用絕大多數的 Java 程式

    • 預設 Import – java.lang.*
  42. 42 Accessing Java Code Base

  43. 43 Java ↔ Scala Collection

  44. 44 Java ↔ Scala Collection

  45. 45 Implicit Conversions

  46. 46 Implicit Conversions

  47. 47 Implicit Conversion

  48. 48 剩下的一小部份

  49. 49 BeanProperty Annotation • 自動產生 JavaBean 的 Getter / Setter

    • scala.reflect package – @BeanProperty • getXXXX() • setXXXX() – @BooleanBeanProperty • IsXXXX() • setXXXX()
  50. 50 BeanProperty Annotation

  51. 51 Java Static Protected Member • Scala 沒有 static 的概念

    • 所有的函式/成員必定屬於某個特定物件 – Singleton 物件 • 語意無法表達 protected static 成員
  52. 52 Java Static Protected Member

  53. 53 Java Static Protected Member

  54. 54 Java Static Protected Member

  55. 55 Java Static Protected Member

  56. 56 Type Inference • Scala 的 Type Inference 並不完美 –

    特別是在泛型和處理基本資料型態時 – 可以使用 .asInstanceOf[T] 來強制轉型 • 例: – (1.5).asInstanceOf[java.lang.Double] – 1.asInstanceOf[java.lang.Integer]
  57. 57 Raw Types

  58. 58 Raw Types

  59. 59 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  60. 60 沒有用到 Scala 特異功能的都可以直接使用

  61. 61 Accessing Scala Code Base

  62. 62 Tools • scalac -print – 將 Scala 的特殊語法轉成 Java

    可表達的語法 – 例如:將 Pattern Matching 轉成 if/else • javap – 因為 Scala 編譯出的是標準的 JVM Bytecode ,可以使用此程式觀看 Scala 產出的 .class 檔的結構
  63. 63 Singleton Object

  64. 64 Singleton Object

  65. 65 Singleton Object

  66. 66 Singleton Object

  67. 67 Tuple • 總共有 N 個類別 – scala.Tuple2[T1, T2] –

    scala.Tuple3[T1, T2, T3] – …. • 唯讀的 Immutable Object • 可以直接在 Java 中使用 – 基本資料型態以 java.lang.Object 做為 T
  68. 68 Tuple

  69. 69 Tuple

  70. 70 Tuple

  71. 71 High-Order Function • 一樣有 N 個 Trait – scala.Function1[T1,

    R] – scala.Function2[T1, T2, R] – …. • 類別中的 apply(T1 v1, T2 v2) 方法即為 函式主體
  72. 72 High-Order Function • 於 Java 中使用 – scala.runtime.AbstractFunctionN –

    覆寫 apply() 方法 – 基本資料型態改用 Object 做型態參數
  73. 73 High-Order Function

  74. 74 High-Order Function

  75. 75 Operator Overloading • Scala 中的 Method 可以用 Operator 當做

    名稱,以此達成 Operator Overloading • Java / JVM 中的 Identifier 名稱規範 – Scala 在編譯時期將 Operator 轉成符合 JVM 規範的 Identifier – 使用 javap 可以看實際上該 Method 的名稱
  76. 76 Operator Overloading

  77. 77 Operator Overloading

  78. 78 Trait

  79. 79 Trait

  80. 80 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  81. 81 Conclusion • Scala 可以幫助你更快地開發程式 • Scala 可以幾乎是無痛地整合至 Java 程式

    • 特別適合用在以下兩種狀況 – Unit Test – Prototyping
  82. 82 Thanks! Enjoy Programming!