Kotlin とは
IntelliJ IDEA 開発元の JetBrains社 の Andrey Breslav と Dmitry Jemerov にて開発されているオブジェクト指向言語。ロシアにある JetBrains社 のラボ近くのコトリン島が名前の由来。Kotlin はフィンランド語でやかんを表すため、ロゴがやかんになっている(このロゴは早めに変えたほうがいいと思う)。
Kotlin のゴールとして
- Java との完全な相互運用ができて
- コンパイル速度は Java と同等
- Java より簡素で
- Java よりエラーの発生が抑えられ
- Scala より簡単
とされている。ターゲットプラットフォームは JVM であり、Java バイトコードを出力する。最近では JavaScript へのコンパイルも可能となっている。、2011年7月に発表、2012年2月に Apache 2 Open Source License にてオープンソース化された。2011年6月にマイルストーン安定版 M2 がリリースされた。
はじめに
IntelliJ のプラグインにて IDE サポートがある。その他にKotlin Web Demo にてブラウザ上で動作させることができる。
ここでは本家のGetting Startedをかいつまんで。
Kotlin pluginのインストール
- 11.1 より新しい IntelliJ IDEA をインストール
- Files > Settings と進み Plugins -> Browse Repositories で 「Kotlin」選択して「Download and Install」
- 最新を入れたい場合には Browse Repositories -> Manage repositories と進み「http://www.jetbrains.com/kotlin/eap-plugin-repository/updatePlugins.xml」を指定
Hello, world!
最初の一歩は古典。
package demo fun main(args : Array<String>) { println("Hello, world!") }
- Java と同じくpackage がある(指定しない場合はデフォルトパッケージ)
- 関数は楽しげに fun ではじめる
- 型は変数名の後に:でつなげる
- 行末のセミコロンはオプション
- 上記例は関数の戻り値を省略している(省略しない場合は fun main(args : Array
) : Unit )
コマンドライン引数と文字列テンプレート
fun main(args : Array<String>) { if (args.size == 0) { println("Please provide a name as a command-line argument") return } println("Hello, ${args[0]}!") }
- コマンドライン引数(args)はArray型で、sizeプロパティにてサイズが得られる
- args[0]のように要素数を指定して値を取得
- 文字列テンプレートで${}にて変数を埋め込み可能
forループ
fun main(args : Array<String>) { for (name in args) println("Hello, $name!") }
- forループも普通
- 実際には「for (val name : String in args)」の省略で型推論されてる
- 文字列テンプレートは1つの変数と解釈できる場面では$のみで記述できる(args[0]の場合は{}が必要)
クラス
class Greeter(val name : String) { fun greet() { println("Hello, $name"); } } fun main(args : Array<String>) { Greeter(args[0]).greet() }
- クラスは class キーワードで指定
- プロパティはクラス名の後に指定(Scalaと同じ)
- クラスのインスタンス化に new は不要
- クラスにはメンバ関数を定義できる
パターンマッチ
fun main(args : Array<String>) { val language = if (args.size == 0) "EN" else args[0] println(when (language) { "EN" -> "Hello!" "ES" -> "¡Hola!" "RU" -> "Привет!" else -> "Sorry, I can't greet you in $language yet" }) }
- if 式は値を返す
- val はイミュータブルなローカル変数として使われている
- when 式にてパターンマッチができ値を返す
拡張Function
fun String.hello() { println("Hello, $this!") } fun main(args : Array<String>) { "world".hello() // prints 'Hello, world!' }
- 既存のクラスを拡張する関数を定義できる(上記はStringクラスに関数を加えている)
- 拡張Function内では自身をthis参照できる
高階関数
fun main(args : Array<String>) { args filter {it.length() > 0} forEach {print("Hello, $it!")} }
- 関数の呼び出しは「.」に替りスペースで記述もできる
- filter は述語関数を渡せる高階関数