如何在 Java App 中導入 Scala

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

description

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

Transcript of 如何在 Java App 中導入 Scala

Page 1: 如何在 Java App 中導入 Scala

如何在如何在 Java AppJava App 中導入中導入 ScalaScala

Brian HsuBrian Hsu

Page 2: 如何在 Java App 中導入 Scala

2

About Me

• 許洛豪 (BrianHsu)

• 經歷– 華寶通訊 Android 手機工程師– 中研院數位典藏成果入口網技術發展組

• 演講– OSDC.tw 2010– COSCUP 2010

Page 3: 如何在 Java App 中導入 Scala

3

Agenda

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

• Call Scala from Java

• Conclusion

Page 4: 如何在 Java App 中導入 Scala

4

Agenda

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

• Call Scala from Java

• Conclusion

Page 5: 如何在 Java App 中導入 Scala

5

Scala 是什麼?

• 執行在 JVM 上的程式語言• 靜態型別的語言• 支援物件導向及 Functional Programming

的多典範程式語言

Page 6: 如何在 Java App 中導入 Scala

6

Scala 的特色

• 設計上就不把 Java 語法相容考慮進去• 靜態/強型別的 JVM 程式語言

– vs Grovvy/JRuby/Clojure...etc.

• 編譯式的程式語言– 編譯成 JVM Bytecode– 也就是 .class 檔

• 提供 REPL / Script 模式

Page 7: 如何在 Java App 中導入 Scala

7

Agenda

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

• Call Scala from Java

• Conclusion

Page 8: 如何在 Java App 中導入 Scala

8

簡單省事

Java 討人厭的地方都被修正了

Page 9: 如何在 Java App 中導入 Scala

9

Scala 幫你省事的部份

• Everything is Object

• Type Inference

• Unchecked Exception

Page 10: 如何在 Java App 中導入 Scala

10

Everything is Object

Page 11: 如何在 Java App 中導入 Scala

11

Type Inference

Page 12: 如何在 Java App 中導入 Scala

12

Unchecked Exception

Page 13: 如何在 Java App 中導入 Scala

13

Scala 的特異功能

• Singleton

• Tuple

• Case Class

• Operator is Method

• Pattern Matching

• Collection / High-order Function / Closure

• Trait

Page 14: 如何在 Java App 中導入 Scala

14

Singleton

Page 15: 如何在 Java App 中導入 Scala

15

Tuple

Page 16: 如何在 Java App 中導入 Scala

16

Tuple

Page 17: 如何在 Java App 中導入 Scala

17

Case Class

Page 18: 如何在 Java App 中導入 Scala

18

Operator is Method

Page 19: 如何在 Java App 中導入 Scala

19

Operator is Method

Page 20: 如何在 Java App 中導入 Scala

20

Pattern Matching

Page 21: 如何在 Java App 中導入 Scala

21

Pattern Matching

Page 22: 如何在 Java App 中導入 Scala

22

Pattern Matching

Page 23: 如何在 Java App 中導入 Scala

23

Collection

Page 24: 如何在 Java App 中導入 Scala

24

High-Order Function / Closure

Page 25: 如何在 Java App 中導入 Scala

25

Trait

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

Page 26: 如何在 Java App 中導入 Scala

26

Java Interface

Page 27: 如何在 Java App 中導入 Scala

27

Trait

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

• 有實作的 Trait

Page 28: 如何在 Java App 中導入 Scala

28

Trait

Page 29: 如何在 Java App 中導入 Scala

29

Agenda

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

• Call Scala from Java

• Conclusion

Page 30: 如何在 Java App 中導入 Scala

30

What could I do?

• Java Legacy Code– REPL 實驗

• Unit Test– ScalaTest (http://www.scalatest.org/)

• Prototyping

Page 31: 如何在 Java App 中導入 Scala

31

Java / Scala 混合專案流程

JavaJava 原始檔原始檔 Java Java 編譯器編譯器

Java .classJava .classBytecode Bytecode 檔案檔案

Java Java Virtual MachineVirtual Machine JAR JAR 檔檔執行執行

Page 32: 如何在 Java App 中導入 Scala

32

Java / Scala 混合專案流程

JavaJava 原始檔原始檔 Java Java 編譯器編譯器

Java .classJava .classBytecode Bytecode 檔案檔案

Java Java Virtual MachineVirtual Machine JAR JAR 檔檔執行執行

ScalaScala 原始檔原始檔

ScalaScala 編譯器編譯器

Page 33: 如何在 Java App 中導入 Scala

33

Scala/Java 相互參照

Page 34: 如何在 Java App 中導入 Scala

34

Scala/Java 相互參照

1.scalac -d classes/ iis/*.java iis/*.scala

2.javac -cp 'classes/:/usr/share/scala/lib/*' -d classes/ iis/*.java

Page 35: 如何在 Java App 中導入 Scala

35

IDE Tools

• Scala IDE for Eclipse– http://www.scala-ide.org/

• IntelliJ IDEA– http://www.jetbrains.com/idea/

Page 36: 如何在 Java App 中導入 Scala

36

Command Line Tool

• SBT (Simple Build Tool)– http://code.google.com/p/simple-build-tool

– 類似 Maven/Ant ,但和 XML 說再見– 可以使用 Maven Repository 裡的函式庫– 自動處理相依性和 Java/Scala 混合編譯的問題

Page 37: 如何在 Java App 中導入 Scala

37

Project Layout

不在 Maven 裡的 JAR 檔

Java 原始碼

Scala 原始碼

Unit Test

Page 38: 如何在 Java App 中導入 Scala

38

Maven Repository

• project/build/TestProject.scala

Page 39: 如何在 Java App 中導入 Scala

39

SBT Commands

• reload

• update

• compile

• run

• console

• test

• exit

Page 40: 如何在 Java App 中導入 Scala

40

Agenda

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

• Call Scala from Java

• Conclusion

Page 41: 如何在 Java App 中導入 Scala

41

Accessing Java Code Base

• Scala 可以直接使用絕大多數的 Java 程式• 預設 Import

– java.lang.*

Page 42: 如何在 Java App 中導入 Scala

42

Accessing Java Code Base

Page 43: 如何在 Java App 中導入 Scala

43

Java ↔ Scala Collection

Page 44: 如何在 Java App 中導入 Scala

44

Java ↔ Scala Collection

Page 45: 如何在 Java App 中導入 Scala

45

Implicit Conversions

Page 46: 如何在 Java App 中導入 Scala

46

Implicit Conversions

Page 47: 如何在 Java App 中導入 Scala

47

Implicit Conversion

Page 48: 如何在 Java App 中導入 Scala

48

剩下的一小部份

Page 49: 如何在 Java App 中導入 Scala

49

BeanProperty Annotation

• 自動產生 JavaBean 的 Getter / Setter

• scala.reflect package– @BeanProperty

• getXXXX()• setXXXX()

– @BooleanBeanProperty• IsXXXX()

• setXXXX()

Page 50: 如何在 Java App 中導入 Scala

50

BeanProperty Annotation

Page 51: 如何在 Java App 中導入 Scala

51

Java Static Protected Member

• Scala 沒有 static 的概念• 所有的函式/成員必定屬於某個特定物件

– Singleton 物件• 語意無法表達 protected static 成員

Page 52: 如何在 Java App 中導入 Scala

52

Java Static Protected Member

Page 53: 如何在 Java App 中導入 Scala

53

Java Static Protected Member

Page 54: 如何在 Java App 中導入 Scala

54

Java Static Protected Member

Page 55: 如何在 Java App 中導入 Scala

55

Java Static Protected Member

Page 56: 如何在 Java App 中導入 Scala

56

Type Inference

• Scala 的 Type Inference 並不完美– 特別是在泛型和處理基本資料型態時– 可以使用 .asInstanceOf[T] 來強制轉型

• 例:– (1.5).asInstanceOf[java.lang.Double]– 1.asInstanceOf[java.lang.Integer]

Page 57: 如何在 Java App 中導入 Scala

57

Raw Types

Page 58: 如何在 Java App 中導入 Scala

58

Raw Types

Page 59: 如何在 Java App 中導入 Scala

59

Agenda

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

• Call Scala from Java

• Conclusion

Page 60: 如何在 Java App 中導入 Scala

60

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

Page 61: 如何在 Java App 中導入 Scala

61

Accessing Scala Code Base

Page 62: 如何在 Java App 中導入 Scala

62

Tools

• scalac -print– 將 Scala 的特殊語法轉成 Java 可表達的語法– 例如:將 Pattern Matching 轉成 if/else

• javap– 因為 Scala 編譯出的是標準的 JVM

Bytecode ,可以使用此程式觀看 Scala 產出的.class 檔的結構

Page 63: 如何在 Java App 中導入 Scala

63

Singleton Object

Page 64: 如何在 Java App 中導入 Scala

64

Singleton Object

Page 65: 如何在 Java App 中導入 Scala

65

Singleton Object

Page 66: 如何在 Java App 中導入 Scala

66

Singleton Object

Page 67: 如何在 Java App 中導入 Scala

67

Tuple

• 總共有 N 個類別– scala.Tuple2[T1, T2]– scala.Tuple3[T1, T2, T3]– ….

• 唯讀的 Immutable Object

• 可以直接在 Java 中使用– 基本資料型態以 java.lang.Object 做為 T

Page 68: 如何在 Java App 中導入 Scala

68

Tuple

Page 69: 如何在 Java App 中導入 Scala

69

Tuple

Page 70: 如何在 Java App 中導入 Scala

70

Tuple

Page 71: 如何在 Java App 中導入 Scala

71

High-Order Function

• 一樣有 N 個 Trait– scala.Function1[T1, R]– scala.Function2[T1, T2, R]– ….

• 類別中的 apply(T1 v1, T2 v2) 方法即為函式主體

Page 72: 如何在 Java App 中導入 Scala

72

High-Order Function

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

Page 73: 如何在 Java App 中導入 Scala

73

High-Order Function

Page 74: 如何在 Java App 中導入 Scala

74

High-Order Function

Page 75: 如何在 Java App 中導入 Scala

75

Operator Overloading

• Scala 中的 Method 可以用 Operator 當做名稱,以此達成 Operator Overloading

• Java / JVM 中的 Identifier 名稱規範– Scala 在編譯時期將 Operator 轉成符合 JVM

規範的 Identifier– 使用 javap 可以看實際上該 Method 的名稱

Page 76: 如何在 Java App 中導入 Scala

76

Operator Overloading

Page 77: 如何在 Java App 中導入 Scala

77

Operator Overloading

Page 78: 如何在 Java App 中導入 Scala

78

Trait

Page 79: 如何在 Java App 中導入 Scala

79

Trait

Page 80: 如何在 Java App 中導入 Scala

80

Agenda

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

• Call Scala from Java

• Conclusion

Page 81: 如何在 Java App 中導入 Scala

81

Conclusion

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

– Unit Test– Prototyping

Page 82: 如何在 Java App 中導入 Scala

82

Thanks!Enjoy Programming!