9. 2-1. Scalaの使い方
セットアップまでは、いろいろなチュートリアルサイトに説明があるので、ここでは簡単に。
1. インストール。
① Javaをインストール、、、
、、、されてますよね!?当然!?
② http://www.scala-lang.org/ からインストーラをDL
→最新バージョンは2.9.0.1です。
2. 環境変数を設定。
3. とりあえず、コマンドプロンプトで
「scala」と打ってみよう。
ちなみに、、、
64bit Windowsで、32bit JDKを使っていると、
scala.batのデバッグから楽しめます。。。
8
Advanced Tech Night
10. 2-2. 手続き型言語と関数型言語とは?
手続き型言語とは?
① 記述された命令を逐次的に実行していくプログラミング言
語のこと。
② 従来のJavaと同様の考え方です。
関数型言語とは?
① すべての計算や処理を、関数の定義の組合せとして記述
するプログラミング言語。
② 関数を値として扱う。
• 関数の引数として関数を使ったり、
関数の引数一部を定数化した関数を作ったり。
• Java8で導入予定のラムダ式も、この考え方を元にしています。
9
Advanced Tech Night
11. 2-3. Scalaの手続き型らしい使い方
object FizzBuzz {
def main(arg:Array[String]) = {
for (n <- 1 to 100) {
if (n % 15 == 0) {
println("FizzBuzz")
} else if (n % 3 == 0) {
println("Fizz")
} else if (n % 5 == 0) {
println("Buzz")
} else {
println(n)
} } } }
10
Advanced Tech Night
12. 2-4. Scalaの関数型らしい使い方1
1. Listを定義
val list = List(1, 2, 3, 4, 5)
2. 関数を定義
① 「Intの引数をとり、二乗した値を返す」関数を
定義して、変数に代入します
val pow = (x:Int) => x * x
3. Listの各要素に関数を適用
① Listから要素を取り出して、一つずつ結果を表示
list.foreach( i => print( pow( i ) + ", " ) )
1, 4, 9, 16, 25,
11
Advanced Tech Night
13. 2-5. Scalaの関数型らしい使い方2
4. 「Listと関数」を引数に持つ関数を定義
def map(x:List[Int])(f:Int => Int):Unit = {
x.foreach( i => print( f( i ) + ", " ) )
}
5. Listと関数を入れてみる
map(list)(pow)
1, 4, 9, 16, 25,
6. 別のListと関数を入れてみる
map(List(1,2,3))(x => x * x * x)
1, 8, 27,
12
Advanced Tech Night
14. 3-1. Javaエンジニアにとって便利な点1
Javaと相互互換
① ScalaはJVM上で実行される
② Scalaから、すべてのJavaクラスを呼び出し可能
豊富なJavaのライブラリをそのまま利用できる
③ JavaクラスからScalaクラスを呼び出すことも自由
これまでの資産を無駄にしないで済む
JavaとScalaを使い分けながら開発できる
13
Advanced Tech Night
15. 3-2. Javaエンジニアにとって便利な点2
コード量を削減
public class Person {
private String lastName_;
private String firstName_; class Person(var lastName:String,
var firstName:String)
public Person(String lastName,
String firstname) { After(Scala)
lastName_ = lastName;
firstName_ = firstName;
}
public void setXxx(xxx) { ・・・ }
public String getXxx() { ・・・ } コンストラクタやsetter/getterは
} 暗黙的に作成される。
Before(Java)
分かりきっていることは、
書きたくないですよね?
14
Advanced Tech Night
16. 3-3. Javaエンジニアにとって便利な点3
Mix-in
① trait(トレイト)を用いた複数継承が可能
② traitは実装を持つinterface 多重継承使い放題!
import scala.io.Source class Staff(name : String) extends Person(name)
with FiniteLoop
class Person(name : String) with PrintWithParen {
trait FiniteLoop { def action(message :String)
# actionとcountを実装してもらう = println(message + "@" + name)
def action(message : String) def count():Int = 5
def count() : Int }
def loop(message:String) = { val person = new Staff("foobar")
val max = count()
for (index <- 1 to max) { person.loop("work")
action(message) person.print("some message")
} } }
trait PrintWithParen {
# actionを実装してもらう
def action(message:String)
def print(message : String) = {
println("{"); action(message); println("}")
} } 15
Advanced Tech Night
17. 3-4. Javaエンジニアにとって便利な点4
演算子のオーバーロード
case class CSVLine ( line_ : String) {
var line: String = line_
def + ( data:String ) : CSVLine = CSVLine(line + "," + data)
def += ( data:String ) : this.type = {
line += "," + data
this
}
}
import scala.io.Source
var csv = CSVLine("")
csv = csv + "foo"
csv += "bar"
Javaではできない演算子の再定義が可能に!
16
Advanced Tech Night
18. 4-1. Javaエンジニアにとって気になるところ1
1. JavaVMのオプションはどうやって指定する?
① 起動スクリプトを見る限り、-D, -Jを付けることで、
JavaVMにオプションが渡せるようになっています。
② デフォルトではヒープサイズの指定(後述)しかして
くれないので、JavaVMお約束のオプションは指定
しておきましょう。
scala.bat
-J-XX:+HeapDumpOnOutOfMemoryError
-J-XX:+PrintClassHistogram -J-verbose:gc
sample.scala
17
Advanced Tech Night
19. 4-2. Javaエンジニアにとって気になるところ2
2. デフォルトのヒープサイズはいくつ?
① 起動スクリプトを見ると、
初期値32MB、最大256MBになってます。
ちょっと本格的な処理を書き始めるとあっさり
OOMEになるので注意が必要です。
② 変更方法は次のどれかですかね。
a. 起動スクリプト直接いじる
b. 環境変数JAVA_OPTSにオプションを列挙する
c. -Jオプションを指定する(例:-J-Xmx1024m)
18
Advanced Tech Night
20. 4-3. Javaエンジニアにとって気になるところ3
3. スレッドダンプでScala部分は見えるの?
⇒scala部分も行数付きで表示されました!
"main" prio=10 tid=0x000000004118f000 nid=0xc83 runnable [0x00007f5ae99cd000]
java.lang.Thread.State: RUNNABLE
at java.lang.String.length(String.java:651)
at java.util.regex.Matcher.getTextLength(Matcher.java:1140)
at java.util.regex.Matcher.reset(Matcher.java:291)
at java.util.regex.Matcher.<init>(Matcher.java:211)
at java.util.regex.Pattern.matcher(Pattern.java:888)
at java.util.Formatter.parse(Formatter.java:2458)
at java.util.Formatter.format(Formatter.java:2414)
at java.util.Formatter.format(Formatter.java:2367)
at java.lang.String.format(String.java:2769)
at scala.collection.immutable.StringLike$class.format(StringLike.scala:270)
at scala.collection.immutable.StringOps.format(StringOps.scala:31)
at OOMESample$$anonfun$main$1.apply(OOMESample.scala:10)
at OOMESample$$anonfun$main$1.apply(OOMESample.scala:9)
at scala.collection.immutable.Range.foreach(Range.scala:75)
at OOMESample$.main(OOMESample.scala:9)
at OOMESample.main(OOMESample.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
19
Advanced Tech Night