Open12

[Kotlin] memo

mu0363mu0363

const

const val PI = 3.14
fun main() {
    ...

Javaで言うところのstatic final ...
constはclass外スコープで宣言する。
インスタンスではなく、クラスで固有な定数となる。
クラスに一つだけ生成される変数なので、メモリの使用量が抑えられる?

mu0363mu0363

trimIndent()

fun main() {
    var hello = """
        How %s
        are
        you?
    """.trimIndent()
    println(hello.format("Ana"))
}

formatで引数(%s)を取れる

mu0363mu0363

when

Switchと同様

fun main() {
    val age = 18
    when (age) {
        in 0..12 -> println("kids")
        in 13..18 -> println("Teenager")
        else -> println("nothing")
    }
}
mu0363mu0363

配列

固定長

fun main() {
    val array: Array<Int> = arrayOf(10, 20, 30)
    val intArray = intArrayOf(40, 50, 60)
    val doubleArray = doubleArrayOf(70.0, 80.0, 90.0)
    val nullArray = arrayOfNulls<String>(5)
    array.forEach { println(it) }
}
mu0363mu0363

List

可変長
順番の概念を持つ

fun main() {
    val list1 = listOf(10, 20, 30)
    val list2 = mutableListOf(10, 20, 30)

    // 変更
    list2[0] = 100

    // 追加
    list2.add(0, 200)

    // 削除
    list2.removeAt(0)
    list2.remove(30)
}
mu0363mu0363

Set

可変長
順番の概念がなく、要素の重複を許可しない

fun main() {
    val set1 = setOf(10, 20, 30)
    val set2 = mutableSetOf(10, 20, 30)

    // 追加
    set2.add(40)
    // 重複は許可されないので40が複数登録されない
    set2.add(40)

    // 削除
    set2.remove(10)
}
mu0363mu0363

Map

可変長
key: valueペア。keyは重複しない。

fun main() {
    val map1 = mapOf("orange" to "オレンジ", "apple" to "アップル")
    val map2 = mutableMapOf("orange" to "オレンジ", "apple" to "アップル")

    // 変更
    map2["apple"] = "りんご"

    // 追加
    map2["banana"] = "バナナ"

    // 削除
    map2.remove("orange")
}
mu0363mu0363

for

fun main() {
    for (i in 1..5) println(i)
    for (i in 5 downTo 1) println(i)
    for (i in 1..10 step 2) println(i)

    val brand = "Brand"
    // 順番逆転
    for (i in brand.reversed()) println(i)
}
mu0363mu0363

While

fun main() {
    var number = 1
    while (number <= 5) {
        println(number)
        number++
    }
}
mu0363mu0363

do while

fun main() {
    var i = 0
    do {
        println(i)
        i++
    } while (i <= 10)
}
mu0363mu0363

continue break outer

fun main() {
    // break (5回でloop抜ける)
    for (i in 0..10) {
        if (i == 5) break
        println(i)
    }

    // continue (偶数は実行される)
    for (i in 0..10) {
        if (i % 2 == 0) continue
        println(i)
    }

    // ネストされたforをouterで抜ける
    outer@ for (i in 0..10) {
        for (j in 0..10) {
            if (j == 5) break@outer
            print(j)
        }
        println()
    }
}
mu0363mu0363

関数

fun main() {
    val returnValue = unionString("Hello", "world")
    println(returnValue)
}

fun unionString(str1: String, str2: String) = "$str1 $str2"

可変長引数

fun main() {
    val intArray = intArrayOf(1, 2, 3, 4, 5)
    // スプレッド演算子*    
    println(union(*intArray))
}

fun union(vararg array: Int): String {
    var str = ""
    for (num in array) str += num

    return str
}

デフォルト引数・名前付き引数

fun main() {
    calcSquareArea(width = 10)
}

fun calcSquareArea(height: Int = 5, width: Int) = height * width

戻り値を複数返す(Pair, Triple)

fun main() {
    val intArray = intArrayOf(10, 20, 30, 40, 50)
    val (sum, max) = sunMax(*intArray)
    println(sum)
    println(max)

    // or
//    val pair: Pair<String, String> = sunMax(*intArray)
//    println(pair.first)
//    println(pair.second)
}

fun sunMax(vararg array: Int): Pair<Int, Int> {
    var sum = 0
    var max = 0

    for (num in array) {
        sum += num
        if (max < num) {
            max = num
        }
    }

    return Pair(sum, max)
}

高階関数(::)

fun main() {
    // 高階関数として扱う
    val hoFunc = ::calcA
}

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

ラムダ式・無名関数

無名関数は返り値の型を指定できる

fun main() {
    // ラムダ式
    val lambda = calcB(10, 20) { x: Int, y: Int -> x + y }
    println(value)

    // 無名関数
    val anonymousFunction = calcB(10, 20, fun(x: Int, y: Int): Int = x + y)

}

fun calcB(num1: Int, num2: Int, func: (Int, Int) -> Int) = func(num1, num2)