Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Java / Scala interaction presentation @ JavaTwo 2011 Conference.

Brian Hsu

July 29, 2011
Tweet

More Decks by Brian Hsu

Other Decks in Programming

Transcript

  1. 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. 13 Scala 的特異功能 • Singleton • Tuple • Case Class

    • Operator is Method • Pattern Matching • Collection / High-order Function / Closure • Trait
  8. 29 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

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

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

    Java 編譯器 編譯器 Java .class Java .class Bytecode Bytecode 檔案 檔案 Java Java Virtual Machine Virtual Machine JAR JAR 檔 檔 執行 執行
  11. 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 編譯器 編譯器
  12. 34 Scala/Java 相互參照 1.scalac -d classes/ iis/*.java iis/*.scala 2.javac -cp

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

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

    http://code.google.com/p/simple-build-tool – 類似 Maven/Ant ,但和 XML 說再見 – 可以使用 Maven Repository 裡的函式庫 – 自動處理相依性和 Java/Scala 混合編譯的問題
  15. 39 SBT Commands • reload • update • compile •

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

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  17. 49 BeanProperty Annotation • 自動產生 JavaBean 的 Getter / Setter

    • scala.reflect package – @BeanProperty • getXXXX() • setXXXX() – @BooleanBeanProperty • IsXXXX() • setXXXX()
  18. 51 Java Static Protected Member • Scala 沒有 static 的概念

    • 所有的函式/成員必定屬於某個特定物件 – Singleton 物件 • 語意無法表達 protected static 成員
  19. 56 Type Inference • Scala 的 Type Inference 並不完美 –

    特別是在泛型和處理基本資料型態時 – 可以使用 .asInstanceOf[T] 來強制轉型 • 例: – (1.5).asInstanceOf[java.lang.Double] – 1.asInstanceOf[java.lang.Integer]
  20. 59 Agenda • Scala 是什麼? • 為什麼使用 Scala ? •

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion
  21. 62 Tools • scalac -print – 將 Scala 的特殊語法轉成 Java

    可表達的語法 – 例如:將 Pattern Matching 轉成 if/else • javap – 因為 Scala 編譯出的是標準的 JVM Bytecode ,可以使用此程式觀看 Scala 產出的 .class 檔的結構
  22. 67 Tuple • 總共有 N 個類別 – scala.Tuple2[T1, T2] –

    scala.Tuple3[T1, T2, T3] – …. • 唯讀的 Immutable Object • 可以直接在 Java 中使用 – 基本資料型態以 java.lang.Object 做為 T
  23. 71 High-Order Function • 一樣有 N 個 Trait – scala.Function1[T1,

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

    覆寫 apply() 方法 – 基本資料型態改用 Object 做型態參數
  25. 75 Operator Overloading • Scala 中的 Method 可以用 Operator 當做

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

    Java / Scala 混合專案流程與工具 • Call Java from Scala • Call Scala from Java • Conclusion