如何在 java app 中導入 scala
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!