如何在 java app 中導入 scala

Post on 10-May-2015

2.903 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

Brian HsuBrian Hsu

2

About Me

• 許洛豪 (BrianHsu)

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

• 演講– OSDC.tw 2010– COSCUP 2010

3

Agenda

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

• Call Scala from Java

• Conclusion

4

Agenda

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

• Call Scala from Java

• Conclusion

5

Scala 是什麼?

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

的多典範程式語言

6

Scala 的特色

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

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

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

• 提供 REPL / Script 模式

7

Agenda

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

• Call Scala from Java

• Conclusion

8

簡單省事

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

9

Scala 幫你省事的部份

• Everything is Object

• Type Inference

• Unchecked Exception

10

Everything is Object

11

Type Inference

12

Unchecked Exception

13

Scala 的特異功能

• Singleton

• Tuple

• Case Class

• Operator is Method

• Pattern Matching

• Collection / High-order Function / Closure

• Trait

14

Singleton

15

Tuple

16

Tuple

17

Case Class

18

Operator is Method

19

Operator is Method

20

Pattern Matching

21

Pattern Matching

22

Pattern Matching

23

Collection

24

High-Order Function / Closure

25

Trait

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

26

Java Interface

27

Trait

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

• 有實作的 Trait

28

Trait

29

Agenda

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

• Call Scala from Java

• Conclusion

30

What could I do?

• Java Legacy Code– REPL 實驗

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

• Prototyping

31

Java / Scala 混合專案流程

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

Java .classJava .classBytecode Bytecode 檔案檔案

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

32

Java / Scala 混合專案流程

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

Java .classJava .classBytecode Bytecode 檔案檔案

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

ScalaScala 原始檔原始檔

ScalaScala 編譯器編譯器

33

Scala/Java 相互參照

34

Scala/Java 相互參照

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

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

35

IDE Tools

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

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

36

Command Line Tool

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

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

37

Project Layout

不在 Maven 裡的 JAR 檔

Java 原始碼

Scala 原始碼

Unit Test

38

Maven Repository

• project/build/TestProject.scala

39

SBT Commands

• reload

• update

• compile

• run

• console

• test

• exit

40

Agenda

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

• Call Scala from Java

• Conclusion

41

Accessing Java Code Base

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

– java.lang.*

42

Accessing Java Code Base

43

Java ↔ Scala Collection

44

Java ↔ Scala Collection

45

Implicit Conversions

46

Implicit Conversions

47

Implicit Conversion

48

剩下的一小部份

49

BeanProperty Annotation

• 自動產生 JavaBean 的 Getter / Setter

• scala.reflect package– @BeanProperty

• getXXXX()• setXXXX()

– @BooleanBeanProperty• IsXXXX()

• setXXXX()

50

BeanProperty Annotation

51

Java Static Protected Member

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

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

52

Java Static Protected Member

53

Java Static Protected Member

54

Java Static Protected Member

55

Java Static Protected Member

56

Type Inference

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

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

57

Raw Types

58

Raw Types

59

Agenda

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

• Call Scala from Java

• Conclusion

60

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

61

Accessing Scala Code Base

62

Tools

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

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

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

63

Singleton Object

64

Singleton Object

65

Singleton Object

66

Singleton Object

67

Tuple

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

• 唯讀的 Immutable Object

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

68

Tuple

69

Tuple

70

Tuple

71

High-Order Function

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

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

72

High-Order Function

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

73

High-Order Function

74

High-Order Function

75

Operator Overloading

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

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

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

76

Operator Overloading

77

Operator Overloading

78

Trait

79

Trait

80

Agenda

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

• Call Scala from Java

• Conclusion

81

Conclusion

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

– Unit Test– Prototyping

82

Thanks!Enjoy Programming!

top related