トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

Kotlin


RSS 無料英単語

目次



記事一覧

キーワード

Kotlin


基本

 パッケージと関数

// ソースファイルの先頭に記述
// ディレクトリ構造と一致する必要はない。
package sample

// 2つのInt引数と戻り値Intをもつ
fun sum(a: Int, b: Int): Int {
    return a + b
}

// 式を持ち、戻り値を推測
fun sum2(a: Int, b: Int) = a + b

// 意味のある値を返さない場合、Unitを使用
fun printSum(a: Int, b: Int): Unit {
    println("$a + $b = ${a + b}")
}

// Unit は省略可能
fun printSum2(a: Int, b: Int) {
    println("$a + $b = ${a + b}")
}

fun main(args: Array<String>) {
    println(sum(1,2))
    println(sum2(3,4))
    printSum(5,6)
    printSum(7,8)
}
実行
PS> kotlinc Test01.kt
PS> kotlin sample.Test01Kt
3
7
5 + 6 = 11
7 + 8 = 15

 ローカル変数

package sample

fun main(args: Array<String>) {
    // val:読み取り専用
    val a: Int = 1 // 即時割り当て
    val b = 2 // Int型を推測
    val c: Int // 即時初期化しない場合、型は必須
    c = 3
    // c = 4 // error: val cannot be reassigned

    // var:変更可能
    var d = 5
    d += 1

    println("$a,$b,$c,$d")
}

 文字列テンプレート

package sample

fun main(args: Array<String>) {
    // 文字列はテンプレート式を含むことができる
    // テンプレート式は、$で始める
    val a = 10
    println("a is $a")

    // 中括弧で任意の式を表現
    val s = "abc"
    println("$s.length is ${s.length}")

    // テンプレートは、raw文字列、エスケープされた文字列もサポートする
    // $リテラルを表示するのに、バックスラッシュエスケープは機能しない(以下参照)
    val l = """
    ${'$'}123
    """
    print(l)
}
実行
PS> kotlin sample.Test03Kt
a is 10
abc.length is 3

    $123

 条件式

package sample

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

// if を式として利用
fun maxOfExpression(a: Int, b: Int) = if (a > b) a else b

fun main(args: Array<String>) {
    println(maxOf(3,5))
    println(maxOfExpression(6,8))
}
実行
PS> kotlin sample.Test04Kt
5
8

 nulableとnullチェック

ターミナルで、kotlinc とタイプすると、REPLが起動する。終了には、:quit

  • 参照は、nullが設定可能な場合、明示的に nullableとマークする必要がある
>>> var a: Int? =null
>>> a
null
  • マークしないとエラー
 >>> var a: Int = null
error: null can not be a value of a non-null type Int
var a: Int = null

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

  • is演算子はインスタンスの型をチェックする
  • イミュータブルなローカル変数、プロパティは型がチェック済みのため明示的なキャストは不要
package sample

fun getStringLen(obj: Any):Int? {
    if (obj is String) {
        // obj は、型チェックブロック内で自動的にキャストされる
        return obj.length;
    }
    // 型チェックブロックの外では、Anyのまま
    return null
}

fun main(args: Array<String>) {
    println(getStringLen("abc"))
    println(getStringLen(123))
}
実行
PS> kotlin sample.Test05Kt
3
null

 forループ

package sample

fun main(args: Array<String>) {
    var items = listOf("a", "b", "c")
    for (item in items) {
        println(item)
    }

    for(index in items.indices) {
        println("item[$index] is ${items[index]}")
    }
}
実行
> kotlin sample.Test06Kt
a
b
c
item[0] is a
item[1] is b
item[2] is c

 whileループ

var index = 0
while(index < items.size) {
    println("item[$index] is ${items[index]}")
    index++    
}

 When式

package sample

fun describe(obj: Any?): String = 
when(obj) {
    1           -> "One"
    "Hello"     -> "Greeting"
    is Long     -> "Long"
    !is String  -> "Not a string"
    else        -> "Unknown"
}

fun main(args: Array<String>) {
    val items = listOf("Hello",1,9999999999,10.1,"hoge")
    for(item in items) {
        println("$item is ${describe(item)}")
    }
}
実行
PS> kotlin sample.Test07Kt
Hello is Greeting
1 is One
9999999999 is Long
10.1 is Not a string
hoge is Unknown

 Rage

package sample

fun main(args: Array<String>) {
    for (x in 1..3) {
        println("iteration $x")
    }

    for (x in 1..6 step 2) {
        println("step $x")
    }
    
    for (x in 6 downTo 1 step 2) {
        println("downTo $x")
    }

    // 値がRangeにの範囲内かinを使用してチェック
    val x = 10
    val y = 9
    if (x in 1..y+1) {
        println("$x in range")
    }

    val index = -1
    val list = listOf("a","b","c")
    if (index !in 0..list.lastIndex) {
        println("$index is out of range")
    }

}
実行
PS> kotlin sample.Test08Kt
iteration 1
iteration 2
iteration 3
step 1
step 3
step 5
downTo 6
downTo 4
downTo 2
10 in range
-1 is out of range

イディオム

 DTO(POJO/POCO)

  • 以下が提供される
    • プロパティに対するgetter/setter
    • equals(),hashCode(),toString(),copy()
    • component1(),component2(),...componentN()全プロパティ
package sample

data class Customer(val name: String, val email: String)

fun main(args: Array<String>) {
    val cust = Customer("hoge","hoge@hoge.com")
    println(cust.toString())
    println("component1=${cust.component1()}")
    println("component2=${cust.component2()}")
    val(name,email) = cust
    print("name=$name,email=$email")
}
実行
PS> kotlin sample.Idiom01Kt
Customer(name=hoge, email=hoge@hoge.com)
component1=hoge
component2=hoge@hoge.com
name=hoge,email=hoge@hoge.com

 関数パラメータデフォルト値

fun foo(a: Int=1, b: String="default") {
    println("a=$a,b=$b")
}

fun main(arg: Array<String>) {
    foo()
    foo(9,"custom")
}

 リストのフィルタ

package sample

fun main(args: Array<String>) {
    // 変更可能なリスト
    val mutableList: MutableList<Int> = mutableListOf()
    for(n in 1..10) {
        mutableList.add(n)
    }
    println(mutableList)
    // リストのフィルタ
    println(mutableList.filter{x -> x % 2 == 0})
}
実行
PS> kotlin sample.Idiom03Kt
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 10]



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto