如何在 java app 中導入 scala

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

Upload: javatwo2011

Post on 10-May-2015

2.903 views

Category:

Technology


4 download

DESCRIPTION

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

TRANSCRIPT

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!