Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) •...

60
Java プログラマ捧げる Scala入門 Seasar Conference 2009 Autumn 2009913日日曜日

Transcript of Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) •...

Page 1: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

Javaプログラマに

捧げる

Scala入門Seasar Conference 2009 Autumn

2009年9月13日日曜日

Page 2: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

自己紹介

ID:yuroyoroゆろよろ

2009年9月13日日曜日

Page 3: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

自己紹介

• 尾崎 智仁(ゆろよろ)

• ID:yuroyoro(はてな、twitter、wassr)

• フリーエンジニア

• JavaとかScalaとかpythonとか

2009年9月13日日曜日

Page 4: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

それでは・・・

2009年9月13日日曜日

Page 5: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

質問たーいむ!!

2009年9月13日日曜日

Page 6: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

Q.Scala本読みました?

2009年9月13日日曜日

Page 7: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

今日の内容

•scalaの紹介!

•デモ2連発っ!

•言語仕様弾丸ツアー!

•まとめっ!2009年9月13日日曜日

Page 8: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scalaの紹介!

2009年9月13日日曜日

Page 9: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

Q.scalaってなに?

2009年9月13日日曜日

Page 10: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

みんな大好きついったーもscalaで動いてます

2009年9月13日日曜日

Page 11: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• jvmで動きます!

•オブジェクト指向 + 関数型

•ファーストクラス関数

•静的型付け + 型推論

•Javaとの相互運用

scalaの特徴

2009年9月13日日曜日

Page 12: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

•インタプリタで動作確認が

できる!

•型推論で簡潔なコード

•でも静的型付け言語

scalaの気持ちいいところ

2009年9月13日日曜日

Page 13: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

•クロージャ + 充実したコレ

クションライブラリ

•Object,traitで進化したオ

ブジェクト指向

scalaの気持ちいいところ

2009年9月13日日曜日

Page 14: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

case class UserTimeline( maxId:Long )

object UserTimelineActor extends Actor{ import Main._

def act = { var cnt:Long = 0 loop{ react{ case UserTimeline( maxId ) => getUserTimeline( maxId ) match { case (xml:Node , nextMaxId:Long ) => outputter.add( xml ) cnt += 200 Thread.sleep(interval) this ! UserTimeline( nextMaxId - 1) case _ => outputter.close exit } } }

scalaのソース(例)

2009年9月13日日曜日

Page 15: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

2009年9月13日日曜日

Page 16: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

ちょwwwイwwミwwフwwwなにwwwこれww

2009年9月13日日曜日

Page 17: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

Scalaは業務では使えない?

2009年9月13日日曜日

Page 18: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

No!!2009年9月13日日曜日

Page 19: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

今から実証

してやんよ!

2009年9月13日日曜日

Page 20: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

デモっ!

2009年9月13日日曜日

Page 21: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

demo その1

•scalaで簡単なスクリプトを書いてみる!

•twitter検索でs2conのハッシュタグを検索

•目標5分!

2009年9月13日日曜日

Page 22: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

demo その2

•S2Console!•Seasarプロダクトをインタプリタで動作確認

•LLフレームワークの対話環境をJavaにも!

2009年9月13日日曜日

Page 23: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

Scala言語仕様弾丸ツアー!

2009年9月13日日曜日

Page 24: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

インタプリタで動作を

確認してみよう!

2009年9月13日日曜日

Page 25: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

基本編

2009年9月13日日曜日

Page 26: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

変数(var,val)

• var/valで変数を宣言

• var 変数名:型 = 値

• varは変更可能、valは変更不

可(final)

2009年9月13日日曜日

Page 27: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

変数(var,val)

scala> val i:Int = 1i: Int = 1scala> i = 2<console>:13: error: reassignment to val i = 2 ^scala> var j = 10j: Int = 10scala> j = 20j: Int = 20

varは代入可能

valは再代入できない変数(javaのfinal)

代入しようとするとエラー

2009年9月13日日曜日

Page 28: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

型推論

•変数、関数の戻り値は省略可

•コンパイラーが推論する

•型パラメータも含めて推論

•関数の引数は省略できない

2009年9月13日日曜日

Page 29: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scala> val list:List[Int] = List(1,2,3,4)

list: List[Int] = List(1, 2, 3, 4)

scala> val list = List(1,2,3,4)

list: List[Int] = List(1, 2, 3, 4)

scala> val a = List(1,2,3).map( _.toString )(0)

a: java.lang.String = 1

省略!

省略できる

関数の戻り値から推論!

型推論

2009年9月13日日曜日

Page 30: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

if文

• if/else文は値を返す

• ifの条件はBoolean

• elseが無い場合は値を返さな

い(Unit型が結果となる)

• if文の結果を変数に代入でき

る(三項演算子的な)

2009年9月13日日曜日

Page 31: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scala> val s = "abcdef"s: java.lang.String = abcdef

scala> if( s.startsWith("abc") ) s.length else 0res4: Int = 6

scala> val r = if(s.length > 1) s.substring(1) else ""r: java.lang.String = bcdef

Int型が返る

条件は(Boolean)

if文

結果を代入!

2009年9月13日日曜日

Page 32: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

for式によるループ

• for式でコレクションの反復処理(java

の拡張forに相当)

• for( 変数 <- コレクション) { ... }

• コレクション生成 - for( 変数 <- コレ

クション) yield { ... }

• フィルター - for ( n <- 1 to 10 ; if n %

2 == 0) yield { ... }

• break/continueはない! (2.8で実装)

2009年9月13日日曜日

Page 33: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scala> for( n <- 1 to 10 if n %2 == 0 ){ print(n * 2 + ",") }4,8,12,16,20,

scala> val g = for( s <- List("a","b","c"); l = s.length )yield { s + ":" + l }g: List[java.lang.String] = List(a:1, b:1, c:1)

1から10のなかで偶数のみ

for式によるループ

結果を代入!

2009年9月13日日曜日

Page 34: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

関数編

2009年9月13日日曜日

Page 35: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

関数

def countChar ( s:String, c:Char ) : Int = {

var cnt:Int = 0

for( ct <- st if ct == c) {

cnt += 1

}

cnt

}

戻り値の型

関数名

引数仮引数:型

defで関数定義

最後に評価された値が戻り値

2009年9月13日日曜日

Page 36: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• def 関数名( 引数 ): 結果型 = { ... }

• val f = 関数名 _ で関数オブジェクト

• 関数リテラル - 無名関数的な

関数

val f = (x:Int,y:Int) => { x + y }

• 関数リテラルでは _ で引数のプレース

ホルダ

引数仮引数:型

本体

2009年9月13日日曜日

Page 37: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scala> def isEven(i:Int):Boolean = { return ( i % 2 == 0 ) } isEven: (Int)Boolean

scala> def isEven(i:Int) = i % 2 == 0isEven: (Int)Boolean

scala> val func = isEven _func: (Int) => Boolean = <function>

scala> val f = (i:Int) => i % 2 == 0f: (Int) => Boolean = <function>

省略!

Javaっぽく書くとこんな感じ

関数をオブジェクトとして変数に

代入!

関数リテラル!

関数

2009年9月13日日曜日

Page 38: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

カリー化と部分適用

• def hoge(i:Int)(j:Int) = i + j•引数を()で分けるとカリー化

• hoge( 1 )(_:Int)•引数に_を指定して関数を部

分適用

2009年9月13日日曜日

Page 39: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scala> def add(n:Int)(m:Int)=n+madd: (n: Int)(m: Int)Int

scala> val add3 = add( 3 ) _add3: (Int) => Int = <function>

scala> def curryingAdd( n:Int ) = add( n ) _curryingAdd: (Int)(Int) => Int

カリー化っ!!

カリー化された”関数”を返す関数

カリー化と部分適用

“_”で部分適用!

2009年9月13日日曜日

Page 40: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

ネスト関数とクロージャ

•関数は入れ子(ネスト)にでき

る!

•関数の外側の変数(自由変数)

を参照できる

•自由変数への参照を実行時に

取り込む (クロージャ )

2009年9月13日日曜日

Page 41: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

def outer ( i:Int, s:String ) = {

val v:String = s + ":" + i

def inner( p:String ) = p + v

inner _

}

入れ子の関数から外側の変数

を参照

自由変数Vを取り込んだinner関数オブジェクト

を返す

ネスト関数とクロージャ

scala> val inf = outer( 5, "hoge" )inf: (String) => java.lang.String = <function>scala> inf("foo - ")res2: java.lang.String = foo - hoge:5

2009年9月13日日曜日

Page 42: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• scalaのコレクションは引数

に関数を取るものが多い

• map,filter,foreach,exist ...•柔軟なコレクションの操作

• List,Map,Setなど

コレクションに関数を

2009年9月13日日曜日

Page 43: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

scala> val list = List(1,2,3,4)res1: List[Int] = List(1, 2, 3, 4)

scala> list.map( {(n:Int) => n * 2} )res2: List[Int] = List(2, 4, 6, 8)

scala> list.filter( _ % 2 == 0 )res3: List[Int] = List(2, 4)

scala> list.filter( func ) res4: List[Int] = List(2, 4)

偶数の要素を抽出

map操作関数リテラルで各要素を2倍

関数オブジェクトを引数に渡す!

コレクションに関数を

2009年9月13日日曜日

Page 44: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

クラス編

2009年9月13日日曜日

Page 45: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• class <クラス名>(コンストラクタ引数)

• objectでシングルトン定義

• ネスト classの中にclassやobject

• staticがないscalaでは、コンパニオン

オブジェクトを利用する

• 同一スコープに同じ名前のclassと

objectがあると特権的な アクセス権

ObjectFoo

classFoo

privateへのアクセス

クラスとオブジェクト

2009年9月13日日曜日

Page 46: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

クラスとオブジェクト

class Foo ( s:String, i:Int ) {

val p1:String = s

var p2:Int = i

private var p3 = 1

def hoge = s * p3

}

object Foo {

val aaa ="aaa"

def setP3( foo:Foo, i:Int) = foo.p3 = i

}

フィールドvalは変更不可varは変更化

クラス名コンストラクタ引数

classでclass定義

関数objectでSingletonobject 同一クラス名の

クラスのprivateフィールドにアクセスできる

2009年9月13日日曜日

Page 47: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• trait は実装をもてるinterface

• classやobjectに複数のtraitをMix-In

• trait の中で実装を持たないメンバは

abstract

traitとmixin

classFoo

traitBar

traitBaz

BarとBazから実装を

継承

2009年9月13日日曜日

Page 48: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

traitとmixin

trait Bar {

val bs:String = "Bar"

def bar( n:Int ) = bs * n

}

trait Baz { def baz( n:Int ) = "Baz" * n }

class Foo extends Bar with Baz

traitはフィールド関数をもてる

trait名traitでtrait定義

withで複数のtraitをmixin

2009年9月13日日曜日

Page 49: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• case class <クラス名>(コンストラク

タ引数)

• case class は名前(...)でインスタンス生

成( immutable object)

• case クラスはパターンとして使える

• matchはswitchの強力なやつ

• 値 match { case パターン => 処理 ...}

• パターン には、値/型/caseクラスを

指定

caseクラスとパターンマッチ

2009年9月13日日曜日

Page 50: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

abstract class Pt

case class CC(s:String) extends Pt

case class DD(i:Int ,s:String) extends Pt

def test(p:Pt) = p match {

case CC( s ) => println( s )

case DD( 3 ,_) => println(“match DD”)

}

case class定義

抽象クラス

matchしたcase classの値を利用

caseクラスとパターンマッチ

case classをパターンとして

match

2009年9月13日日曜日

Page 51: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• implicit conversion

- 暗黙の型変換( StringからDoubleに自動変換etc)

• implict parameter

- 型による自動判別を行うデフォルト引数

• structual typing

- type safeなダックタイピング

• lazy value

- 遅延評価

ちょっとだけよ・・・

2009年9月13日日曜日

Page 52: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

• XMLリテラル

- xmlをリテラルで評価

• 共変/反変なGenerics

- Array[String]はArray[Any]のサブクラス

• actorライブラリ

- mesage base非同期処理

• Lift web framework

- 関数型webフレームワーク

ちょっとだけよ・・・

2009年9月13日日曜日

Page 53: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

まとめっ!

2009年9月13日日曜日

Page 54: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

フリーダムすぐる

言語仕様を楽しめ!!

2009年9月13日日曜日

Page 55: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

JavaとLLの融合!!

2009年9月13日日曜日

Page 56: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

進化したオブジェクト指向でJavaの常識を破壊せよ!!

2009年9月13日日曜日

Page 57: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

関数型言語の概念を加えた次世代の

プログラミングパラダイム!!

2009年9月13日日曜日

Page 58: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

情報源

•公式サイトhttp://www.scala-lang.org/

• Scala 東北https://sites.google.com/site/scalatohoku/

• Scala-behttp://groups.google.co.jp/group/scala-be

•Programming in Scalahttp://www.amazon.co.jp/Programming-Scala-Comprehensive-Step-step/dp/0981531601

2009年9月13日日曜日

Page 59: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

Have fun with

Scala !!

2009年9月13日日曜日

Page 60: Java - Seasar Foundation · 2017. 12. 12. · •class (コンストラクタ引数) • objectでシングルトン定義 • ネスト classの中にclassやobject

ご清聴ありがとうございました!

2009年9月13日日曜日