Slide 1

Slide 1 text

如何在 如何在 Java App Java App 中導入 中導入 Scala Scala Brian Hsu Brian Hsu

Slide 2

Slide 2 text

2 About Me • 許洛豪 (BrianHsu) • 經歷 – 華寶通訊 Android 手機工程師 – 中研院數位典藏成果入口網技術發展組 • 演講 – OSDC.tw 2010 – COSCUP 2010

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

5 Scala 是什麼? • 執行在 JVM 上的程式語言 • 靜態型別的語言 • 支援物件導向及 Functional Programming 的多典範程式語言

Slide 6

Slide 6 text

6 Scala 的特色 • 設計上就不把 Java 語法相容考慮進去 • 靜態/強型別的 JVM 程式語言 – vs Grovvy/JRuby/Clojure...etc. • 編譯式的程式語言 – 編譯成 JVM Bytecode – 也就是 .class 檔 • 提供 REPL / Script 模式

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

8 簡單省事 Java 討人厭的地方都被修正了

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

10 Everything is Object

Slide 11

Slide 11 text

11 Type Inference

Slide 12

Slide 12 text

12 Unchecked Exception

Slide 13

Slide 13 text

13 Scala 的特異功能 • Singleton • Tuple • Case Class • Operator is Method • Pattern Matching • Collection / High-order Function / Closure • Trait

Slide 14

Slide 14 text

14 Singleton

Slide 15

Slide 15 text

15 Tuple

Slide 16

Slide 16 text

16 Tuple

Slide 17

Slide 17 text

17 Case Class

Slide 18

Slide 18 text

18 Operator is Method

Slide 19

Slide 19 text

19 Operator is Method

Slide 20

Slide 20 text

20 Pattern Matching

Slide 21

Slide 21 text

21 Pattern Matching

Slide 22

Slide 22 text

22 Pattern Matching

Slide 23

Slide 23 text

23 Collection

Slide 24

Slide 24 text

24 High-Order Function / Closure

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

26 Java Interface

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

28 Trait

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

30 What could I do? • Java Legacy Code – REPL 實驗 • Unit Test – ScalaTest (http://www.scalatest.org/) • Prototyping

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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 編譯器 編譯器

Slide 33

Slide 33 text

33 Scala/Java 相互參照

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

35 IDE Tools • Scala IDE for Eclipse – http://www.scala-ide.org/ • IntelliJ IDEA – http://www.jetbrains.com/idea/

Slide 36

Slide 36 text

36 Command Line Tool • SBT (Simple Build Tool) – http://code.google.com/p/simple-build-tool – 類似 Maven/Ant ,但和 XML 說再見 – 可以使用 Maven Repository 裡的函式庫 – 自動處理相依性和 Java/Scala 混合編譯的問題

Slide 37

Slide 37 text

37 Project Layout 不在 Maven 裡的 JAR 檔 Java 原始碼 Scala 原始碼 Unit Test

Slide 38

Slide 38 text

38 Maven Repository • project/build/TestProject.scala

Slide 39

Slide 39 text

39 SBT Commands • reload • update • compile • run • console • test • exit

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

41 Accessing Java Code Base • Scala 可以直接使用絕大多數的 Java 程式 • 預設 Import – java.lang.*

Slide 42

Slide 42 text

42 Accessing Java Code Base

Slide 43

Slide 43 text

43 Java ↔ Scala Collection

Slide 44

Slide 44 text

44 Java ↔ Scala Collection

Slide 45

Slide 45 text

45 Implicit Conversions

Slide 46

Slide 46 text

46 Implicit Conversions

Slide 47

Slide 47 text

47 Implicit Conversion

Slide 48

Slide 48 text

48 剩下的一小部份

Slide 49

Slide 49 text

49 BeanProperty Annotation • 自動產生 JavaBean 的 Getter / Setter • scala.reflect package – @BeanProperty • getXXXX() • setXXXX() – @BooleanBeanProperty • IsXXXX() • setXXXX()

Slide 50

Slide 50 text

50 BeanProperty Annotation

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

52 Java Static Protected Member

Slide 53

Slide 53 text

53 Java Static Protected Member

Slide 54

Slide 54 text

54 Java Static Protected Member

Slide 55

Slide 55 text

55 Java Static Protected Member

Slide 56

Slide 56 text

56 Type Inference • Scala 的 Type Inference 並不完美 – 特別是在泛型和處理基本資料型態時 – 可以使用 .asInstanceOf[T] 來強制轉型 • 例: – (1.5).asInstanceOf[java.lang.Double] – 1.asInstanceOf[java.lang.Integer]

Slide 57

Slide 57 text

57 Raw Types

Slide 58

Slide 58 text

58 Raw Types

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

60 沒有用到 Scala 特異功能的都可以直接使用

Slide 61

Slide 61 text

61 Accessing Scala Code Base

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

63 Singleton Object

Slide 64

Slide 64 text

64 Singleton Object

Slide 65

Slide 65 text

65 Singleton Object

Slide 66

Slide 66 text

66 Singleton Object

Slide 67

Slide 67 text

67 Tuple • 總共有 N 個類別 – scala.Tuple2[T1, T2] – scala.Tuple3[T1, T2, T3] – …. • 唯讀的 Immutable Object • 可以直接在 Java 中使用 – 基本資料型態以 java.lang.Object 做為 T

Slide 68

Slide 68 text

68 Tuple

Slide 69

Slide 69 text

69 Tuple

Slide 70

Slide 70 text

70 Tuple

Slide 71

Slide 71 text

71 High-Order Function • 一樣有 N 個 Trait – scala.Function1[T1, R] – scala.Function2[T1, T2, R] – …. • 類別中的 apply(T1 v1, T2 v2) 方法即為 函式主體

Slide 72

Slide 72 text

72 High-Order Function • 於 Java 中使用 – scala.runtime.AbstractFunctionN – 覆寫 apply() 方法 – 基本資料型態改用 Object 做型態參數

Slide 73

Slide 73 text

73 High-Order Function

Slide 74

Slide 74 text

74 High-Order Function

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

76 Operator Overloading

Slide 77

Slide 77 text

77 Operator Overloading

Slide 78

Slide 78 text

78 Trait

Slide 79

Slide 79 text

79 Trait

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

81 Conclusion • Scala 可以幫助你更快地開發程式 • Scala 可以幾乎是無痛地整合至 Java 程式 • 特別適合用在以下兩種狀況 – Unit Test – Prototyping

Slide 82

Slide 82 text

82 Thanks! Enjoy Programming!