Kotlin 基本的な構文

Kotlinファイルには.kt拡張子が付いています。

パッケージ宣言

コードファイルの先頭は通常、パッケージの宣言です。

package com.ceodata.main

import java.util.*

fun test() {}
class Ceodata {}

Kotlinソースファイルは一致するディレクトリとパッケージがいらないで、ソースファイルは任意のファイルディレクトリに配置できます。

上記の例では、test()のフルネームはcom.ceodata.main.testであり、Ceodataのフルネームはcom.ceodata.main.Ceodataです。

パッケージが指定されていない場合、デフォルトでデフォルトのパッケージになります。

デフォルトでインポートする

複数のパッケージはデフォルトで各Kotlinファイルにインポートされます。

  • kotlin.*
  • kotlin.annotation.*
  • kotlin.collections.*
  • kotlin.comparisons.*
  • kotlin.io.*
  • kotlin.ranges.*
  • kotlin.sequences.*
  • kotlin.text.*

関数の定義

関数の定義にはキーワードfunを使用し、パラメータの構文は次のとおりです。パラメータ:型

fun sum(a: Int, b: Int): Int {   // Int パラメータ,返す値 Int
    return a + b
}

式は関数の本体であり、返す値の型は自動的に推測されます。

fun sum(a: Int, b: Int) = a + b

public fun sum(a: Int, b: Int): Int = a + b   // public メソッドは返す値の型を明確に記述する必要があります

返す値のない関数(Javaのvoidに似てます):

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

// Unit型を返す場合は、省略できます(publicメソッドについても同じです):

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

可変長パラメータ関数

関数の可変長パラメータは、varargキーワードでマークできます。

fun vars(vararg v:Int){
    for(vt in v){
        print(vt)
    }
}

// テスト

fun main(args: Array<String>) {
    vars(1,2,3,4,5)  // 12345を出力します
}

lambda(無名関数)

lambda式の実例:

// 测试
// テスト

fun main(args: Array<String>) {
    val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
    println(sumLambda(1,2))  //  3を出力します
}

定数と変数を定義する

可変変数の定義:varキーワード

var <識別子>:<型> = <初期化値>

不変変数の定義:valキーワード、一度だけ割り当てることができる変数(Javaにあるfinal変数に似てます)

val <識別子>:<型> = <初期化値>

定数と変数には初期化値を含めないことはできますが、参照する前に初期化する必要があります

コンパイラは自動的に型の判定をサポートしています。つまり、宣言する時には型を指定しなくてもいいです。コンパイラでそれを判定します。

val a: Int = 1
val b = 1       // システムは自動的に変数の型がIntであると判定します
val c: Int      // 宣言時に初期化しない場合は、変数の型を指定する必要があります
c = 1           // 明確な割り当て


var x = 5        // システムは自動的に変数の型がIntであると判定します
x += 1           // 変数は変更できます

コメント

Kotlinは1行および複数行のコメントをサポートしています。実例は次の通りです。

// これは1行のコメントです

/* これは複数行の
    ブロックコメントです。 */

Javaとは異なり、Kotlinのブロックコメントはネストが可能です。

文字列テンプレート

$変数名または変数値を表します

$varName 変数値を表します

${varName.fun()} 変数のメソッドの返す値を表します:

var a = 1
// テンプレート内のシンプルな名字:
val s1 = "a is $a" 

a = 2
// テンプレート内の任意の式:
val s2 = "${s1.replace("is", "was")}, but now is $a"

NULLチェックメカニズム

Kotlinのnull安全設計は、nullであるパラメータの宣言に使用されます。使用する際には、nullの判定処理が必要で、2つの方法があります。1つはフィールドの後に!!を追加し、Javaのようにnull例外をスローします。もう一つは他のフィールドの後に?を追加し、処理がないでnullを返し、または?:と協力してnullの判定処理を実行します。

//型の後に?を追加し、nullであることができることを示します
var age: String? = "23" 
//nullポインタ例外をスローします
val ages = age!!.toInt()
//処理せずにnullを返します
val ages1 = age?.toInt()
//ageがnullの場合は-1を返します
val ages2 = age?.toInt() ?: -1

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になる可能性があるため、エラーが発生します。.
  if (x != null && y != null) {
  // null値をチェックした後、xとyの型は自動的にnull以外の変数に変換されます
    print(x * y)
  }
}

型の検出と自動的に型の変換

is演算子を使用して、式が特定の型のインスタンスであるかどうかを検出できます。(Javaのinstanceofキーワードに似てます)

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
// 型が判断された後、objはシステムによって自動的にString型に変換されます
    return obj.length 
  }

 //Javaのinstanceofとは異なる別のメソッドがあり、!isを使用します
  // if (obj !is String){
  //   // XXX
  // }

// ここでの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
}

間隔

間隔の式は、inおよび!inで補足された演算子形式のrangeTo関数によって形成されます。

間隔は、同等の型に対して定義されていますが、整数プリミティブ型の場合、実装が最適化されています。 次には間隔を使用する例を挙げます。

for (i in 1..4) print(i) // “1234”を出力します

for (i in 4..1) print(i) // 何も出力しません

if (i in 1..10) { //  1 <= i && i <= 10に相当します
    println(i)
}

for (i in 4 downTo 1 step 2) print(i) // 输出“42”
// stepを使用して間隔を指定します
for (i in 1..4 step 2) print(i) // “13”を出力します

for (i in 4 downTo 1 step 2) print(i) // “42”を出力します

// until関数を使用して、終了の要素を除外します
for (i in 1 until 10) {   // i in [1, 10)  10を除外しました
     println(i)
}

テストの例

fun main(args: Array<String>) {
    print("ループで出力します:")
    for (i in 1..4) print(i) // “1234”を出力します
    println("\n----------------")
    print("間隔を設定します:")
    for (i in 1..4 step 2) print(i) // “13”を出力します
    println("\n----------------")
    print(" downToを使用します:")
    for (i in 4 downTo 1 step 2) print(i) // “42”を出力します
    println("\n----------------")
    print(" untilを使用します:")
    // until関数を使用して、終了の要素を除外します
    for (i in 1 until 4) {   // i in [1, 4)  4を除外しました
        print(i)
    }
    println("\n----------------")
}

出力の結果:

ループで出力します:1234
----------------
間隔を設定します:13
----------------
 downToを使用します:42
----------------
 untilを使用します:123
----------------
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です