Kotlinの公式リファレンスを翻訳してみました。まだ一部ですが、ぼちぼち進めていきたいと思います。
- (日本語版Kotlinリファレンス)http://dogwood008.github.io/kotlin-web-site-ja/
- (本家Kotlinリファレンス)https://kotlinlang.org/docs/reference/
基本文法
パッケージの定義
パッケージの記述は、ソースファイルの先頭になければならない。
package my.demo import java.util.* // ...
ディレクトリやパッケージに合致する必要はない。 ソースファイルをファイルシステムの任意の位置に置くことができる。
Packagesを参照のこと。
関数の定義
2つのInt
型の引数を持ち、Int
型を戻り値とする関数:
fun sum(a: Int, b: Int): Int { return a + b }
実体と推論された戻り値の型を持つ関数:
fun sum(a: Int, b: Int) = a + b
意味のある値を返さない関数:
fun printSum(a: Int, b: Int): Unit { print(a + b) }
Unit
型の戻り値は、省略できる:
public fun printSum(a: Int, b: Int) { print(a + b) }
Functionsを参照のこと。
ローカル変数の定義
1度だけ代入できる(読み取り専用)ローカル変数:
val a: Int = 1 val b = 1 // `Int`型が推論される val c: Int // 初期値が与えられない場合、型指定が必要 c = 1 // 明確な代入
Mutable(可変)な変数:
var x = 5 // `Int`型が推論される x += 1
Properties And Fieldsも参照のこと。
Stringテンプレートの使用
fun main(args: Array<String>) { if (args.size() == 0) return print("First argument: ${args[0]}") }
String templatesも参照のこと。
条件式
fun max(a: Int, b: Int): Int { if (a > b) return a else return b }
if{: .keyword }を式のように使用することもできる:
fun max(a: Int, b: Int) = if (a > b) a else b
if{: .keyword }-expressionsを参照のこと。
null許容変数の使用と null{: .keyword }のチェック
null{: .keyword }値を許容するのであれば、明示的にnull許容であると表記しなければならない。
もしstr
が整数値を持たなければ、 null{: .keyword }を返す:
fun parseInt(str: String): Int? { // ... }
null許容値を戻り値として返す関数を使う:
fun main(args: Array<String>) { if (args.size() < 2) { print("Two integers expected") return } val x = parseInt(args[0]) val y = parseInt(args[1]) // `x`, `y`はnullが入っていることがあるので、`x * y`はエラーを引き起こす if (x != null && y != null) { // `x`と`y`は、nullチェックの後自動的に非null許容型へキャストされる print(x * y) } }
or
// ... if (x == null) { print("Wrong number format in '${args[0]}'") return } if (y == null) { print("Wrong number format in '${args[1]}'") return } // `x`と`y`は、nullチェックの後自動的に非null許容型へキャストされる print(x * y)
Null-safetyを参照のこと。
型チェックと自動キャストの使用
is{: .keyword }演算子は、式がその型のインスタンスであるかを確かめる。 もし可変なローカル変数やプロパティが特定の型でチェックされれば、明示的にキャストする必要はない:
fun getStringLength(obj: Any): Int? { if (obj is String) { // `obj` はこのブランチ内では自動的に`String`へキャストされる return obj.length } // `obj` は型チェックが行われたブランチ外では、まだ`Any`型である return null }
or
fun getStringLength(obj: Any): Int? { if (obj !is String) return null // `obj` はこのブランチ内では自動的に`String`へキャストされる return obj.length }
or even
fun getStringLength(obj: Any): Int? { // `obj` は`&&`の右側では自動的に`String`へキャストされる if (obj is String && obj.length > 0) return obj.length return null }
Classes and Type castsを参照のこと。
for
ループの使用
fun main(args: Array<String>) { for (arg in args) print(arg) }
or
for (i in args.indices) print(args[i])
for loopを参照のこと。
while
ループの使用
fun main(args: Array<String>) { var i = 0 while (i < args.size()) print(args[i++]) }
while loopを参照のこと。
when
式の使用
fun cases(obj: Any) { when (obj) { 1 -> print("One") "Hello" -> print("Greeting") is Long -> print("Long") !is String -> print("Not a string") else -> print("Unknown") } }
when expressionを参照のこと。
範囲の使用
in{: .keyword }演算子を使用すると、ある数が範囲内にあるかをチェックできる:
if (x in 1..y-1) print("OK")
ある数が範囲外かチェックする:
if (x !in 0..array.lastIndex) print("Out")
範囲内で反復する:
for (x in 1..5) print(x)
Rangesを参照のこと。
コレクションの使用
コレクション内で反復する:
for (name in names) println(name)
コレクションがあるオブジェクトを含むかを in{: .keyword }演算子で調べる:
if (text in names) // names.contains(text) が呼ばれる print("Yes")
関数リテラルをfilter
やmap
のコレクションとして使用する:
names .filter { it.startsWith("A") } .sortedBy { it } .map { it.toUpperCase() } .forEach { print(it) }