Edit Page

基本的な構文

パッケージの定義

パッケージの記述は、ソースファイルの先頭に置かなければなりません。

package my.demo

import java.util.*

// ...

ディレクトリとパッケージと一致する必要はありません。ソースファイルは、ファイルシステム内の任意の場所に配置することができます。

パッケージを参照してください。

関数の定義

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型の戻り値は省略できます:

fun printSum(a: Int, b: Int) {
  print(a + b)
}

関数を参照してください。

ローカル変数の定義

1度だけ代入できる(読み取り専用)ローカル変数:

val a: Int = 1
val b = 1   // `Int`型が推論される
val c: Int  // 初期値が与えられない場合、型指定が必要
c = 1       // 明確な代入

変更可能 (Mutable) な変数:

var x = 5 // `Int`型が推論される
x += 1

プロパティとフィールドも参照してください。

コメント

JavaとJavaScriptのように、Kotlinは行末コメントとブロックコメントをサポートしています。

// これは行末コメントです

/* これは複数行にわたる
   ブロックコメントです。 */

Javaとは異なり、Kotlinのブロックコメントは入れ子にすることができます。

ドキュメンテーションコメントの構文の詳細については、Kotlinコードの文章化を参照してください。

文字列テンプレートの使用

fun main(args: Array<String>) {
  if (args.size == 0) return

  print("First argument: ${args[0]}")
}

文字列テンプレートを参照してください。

条件式の使用

fun max(a: Int, b: Int): Int {
  if (a > b)
    return a
  else
    return b
}

ifを式として使用:

fun max(a: Int, b: Int) = if (a > b) a else b

ifを参照してください。

NULL可能値を使用した、nullのチェック

null値を取り得る場合、参照は明示的にnullとしてマークする必要があります。

strは整数を保持していない場合はnullを返します:

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)
  }
}

または

  // ...
  if (x == null) {
    print("Wrong number format in '${args[0]}'")
    return
  }
  if (y == null) {
    print("Wrong number format in '${args[1]}'")
    return
  }

  // x and y are automatically cast to non-nullable after null check
  print(x * y)

null安全を参照してください。

型チェックと自動キャストの使用

is演算子はある式がある型のインスタンスであるかのチェックを行います。 不変のローカル変数やプロパティが特定の型であるかチェックされている場合は、明示的にキャストする必要はありません:

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // `obj` はこのブランチ内では自動的に`String`へキャストされる
    return obj.length
  }

  // `obj` は型チェックが行われたブランチ外では、まだ`Any`型である
  return null
}

または

fun getStringLength(obj: Any): Int? {
  if (obj !is String)
    return null

  // `obj` はこのブランチ内では自動的に`String`へキャストされる
  return obj.length
}

あるいは

fun getStringLength(obj: Any): Int? {
  // `obj` は`&&`の右側では自動的に`String`へキャストされる
  if (obj is String && obj.length > 0)
    return obj.length

  return null
}

クラス型のキャストを参照してください。

forループの使用

fun main(args: Array<String>) {
  for (arg in args)
    print(arg)
}

または

for (i in args.indices)
  print(args[i])

forループを参照してください。

whileループの使用

fun main(args: Array<String>) {
  var i = 0
  while (i < args.size)
    print(args[i++])
}

whileループを参照してください。

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式を参照してください。

範囲の使用

in演算子を使用すると、数が範囲内にあるかどうかを確認できます:

if (x in 1..y-1)
  print("OK")

数が範囲外であるかどうかを確認します:

if (x !in 0..array.lastIndex)
  print("Out")

範囲内で反復処理:

for (x in 1..5)
  print(x)

範囲を参照してください。

コレクションの使用

コレクション内で反復処理:

for (name in names)
  println(name)

コレクションがあるオブジェクトを含むかをin演算子で調べる:

if (text in names) // names.contains(text) が呼ばれる
  print("Yes")

フィルタやマップコレクションにラムダ式を使用します:

names
    .filter { it.startsWith("A") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { print(it) }

高階関数とラムダを参照してください。