LoginSignup
0
0

More than 1 year has passed since last update.

プログラミングノート for kotlin

Last updated at Posted at 2023-04-24

目的

kotlin言語の基本文法をおさえるためのまとめノートを作成する

前提

Javaと比較する想定のため、Java言語を理解している前提

変数の宣言

言語 意味 実装
kotlin 変数 var
定数 val
Java 変数 何もつけない
定数 final

条件分岐

※if文はjavaと同様に書けたので省略。

if式

・関数で if式のパターンを実装

class If {
    fun ifExpression(s: String): Unit {
        var msg = if (s == "kotlin") {
            "kotlin"
        } else if (s == "java") {
            "java"
        } else {
            "other"
        }
        println(msg)
    }
}

・エントリーポイントで関数を実行

fun main(args: Array<String>) {
    val ifKotlin = If()
    ifKotlin.ifExpression("kotlin")
    ifKotlin.ifExpression("java")
    ifKotlin.ifExpression("aaa")
}

・実行結果

kotlin
java
other

when式

・関数で when式のパターンを実装

class When {
    fun whenExpression(a: String): Unit {
        when (a) {
            "kotlin" -> println("kotlinが渡されました")
            "java" -> println("javaが渡されました")
            else -> {
                //ブロックにすると、複数行処理がかける
                println("kotlinでもjavaでもありません")
            }
        }

    }
}

・エントリーポイントで関数を実行

fun main(args: Array<String>) {
    val whenKotlin = When()
    whenKotlin.whenExpression("kotlin")
    whenKotlin.whenExpression("java")
    whenKotlin.whenExpression("php")
}

・実行結果

kotlinが渡されました
javaが渡されました
kotlinでもjavaでもありません

ループ

forループ

・関数でループパターンを実装

class ForLoop {
    fun indexLoop(): Unit {
        //通常for文
        for (i in 1..3) {
            println("通常for文:${i}")
        }
    }

    fun exLoop(): Unit {
        //拡張for文
        val list = listOf(1, 2, 3)
        for (i in list) {
            println("拡張for文:${i}")
        }
    }

    fun eachLoop(): Unit {
        //forEach関数
        val list = listOf(1, 2, 3)
        list.forEach { index -> println("forEach:${index}") }
    }

    fun eachIndexLoop(): Unit {
        //index+要素で取得できる方法
        val list = listOf("shelly", "bourbon", "jin")
        list.forEachIndexed { index, data -> println("forEach:${index}:${data}") }
    }
}

・エントリーポイントで関数を実行

fun main(args: Array<String>) {
    val forLoop = ForLoop()
    forLoop.indexLoop()
    forLoop.exLoop()
    forLoop.eachLoop()
    forLoop.eachIndexLoop()
}

・実行結果

通常for文:1
通常for文:2
通常for文:3
拡張for文:1
拡張for文:2
拡張for文:3
forEach:1
forEach:2
forEach:3
forEach:0:shelly
forEach:1:bourbon
forEach:2:jin

ループ範囲指定方法

・関数でループ範囲指定パターンを実装

class ForLoopRange {
    fun untilLoop() {
        //until
        for (i in 1 until 3) {
            println("untilは最後を含めない:${i}")
        }
    }

    fun downToLoop() {
        //downTo
        for (i in 3 downTo 1) {
            println("1ずつ減らす:${i}")
        }
    }

    fun stepLoop() {
        //skip
        for (i in 1..20 step 3) {
            println("3飛びで進む:${i}")
        }
    }

    fun outerBreak() {
        //ラベル構文
        outer@
        for (i in 1..10) {
            for (j in 1..10) {
                if (j > 5) break@outer
                println("i:${i} j:${j}")
            }
        }
    }

    fun notOuterBreak() {
        //ラベル構文なしのbreak
        for (i in 1..5) {
            for (j in 1..5) {
                if (j > 2) break
                println("i:${i} j:${j}")
            }
        }
    }
}

・エントリーポイントで関数を実行

fun main(args: Array<String>) {
    val range = ForLoopRange()
    println("==untilLoop==")
    range.untilLoop()
    println("")
    println("==downToLoop==")
    range.downToLoop()
    println("")
    println("==stepLoop==")
    range.stepLoop()
    println("")
    println("==outerBreak==")
    range.outerBreak()
    println("")
    println("==notOuterBreak==")
    range.notOuterBreak()
}

・実行結果 ※ログ見にくいので関数毎にタイトル付ける

==untilLoop==
untilは最後を含めない:1
untilは最後を含めない:2

==downToLoop==
1ずつ減らす:3
1ずつ減らす:2
1ずつ減らす:1

==stepLoop==
3飛びで進む:1
3飛びで進む:4
3飛びで進む:7
3飛びで進む:10
3飛びで進む:13
3飛びで進む:16
3飛びで進む:19

==outerBreak==
i:1 j:1
i:1 j:2
i:1 j:3
i:1 j:4
i:1 j:5

==notOuterBreak==
i:1 j:1
i:1 j:2
i:2 j:1
i:2 j:2
i:3 j:1
i:3 j:2
i:4 j:1
i:4 j:2
i:5 j:1
i:5 j:2

可変長引数・分解宣言

関数定義

class Vararg {
    fun sumReturn(vararg values: Int): Int {
        var result = 0
        for (value in values) {
            result += value
        }
        return result
    }

    fun sumPairReturn(vararg values: Int): Pair<Int, Double> {
        //Pairで2つ戻り値を戻す
        var result = 0
        for (value in values) {
            result += value
        }
        return Pair(result, result / 10.0)
    }

    fun sumTripleReturn(vararg values: Int): Triple<Int, Double, Int> {
        //Tripleで3つ戻り値を戻す
        var result = 0
        for (value in values) {
            result += value
        }
        return Triple(result, result / 10.0, result + 1)
    }

}

テストクラス

import org.junit.jupiter.api.Test

class VarargTest {

    @Test
    fun sumReturn() {
        val vararg = Vararg()
        val result = vararg.sumReturn(2,3)
        assert(result == 5)
    }

    @Test
    fun sumReturnSplet() {
        //スプレット演算子を用いた場合
        val vararg = Vararg()
        val list = intArrayOf(4,5)
        val result = vararg.sumReturn(2,*list,3)
        assert(result == 14)
    }

    @Test
    fun sumPairReturn() {
        val vararg = Vararg()
        val list = intArrayOf(4,5)
        val result = vararg.sumPairReturn(2,*list,3)
        assert(result == Pair(14,1.4))
    }

    @Test
    fun sumTripleReturn() {
        val vararg = Vararg()
        val list = intArrayOf(4,5)
        val result = vararg.sumTripleReturn(2,*list,3)
        assert(result == Triple(14,1.4,15))
    }

}

コレクション

Map

ストラテジーパターンを使って、mapから実装したクラスを取り出す処理
クラス分割が多いので気になる方はgitにあります。

JavaFactory.kt
class JavaFactory {
    private val javaTypes: Map<JavaType, Java> = object : HashMap<JavaType, Java>() {
        init {
            put(JavaType.JAVA_BRONZE, JavaBronze())
            put(JavaType.JAVA_SILVER, JavaSilver())
            put(JavaType.JAVA_GOLD, JavaGold())
        }
    }

    @NotNull
    fun of(javaType: JavaType): Java {
        return javaTypes[javaType]!!
    }
}
Map.kt
class Map {
    fun getJava(javaType: JavaType): Java {
        val factory = JavaFactory()
        return factory.of(javaType)
    }
}

・テストクラス

class MapTest {

    @Test
    fun getJava() {
        val map = Map()
        val result = map.getJava(JavaType.JAVA_BRONZE)
        assertEquals(result.show(),"JavaBronze")
    }
}

github
https://github.com/Shinya-Takiyoshi/kotlin-sandbox

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0