Kotlinチートシート

# 最初に
Kotlinって便利！でも現状Javaも使わなきゃ。あれってKotlinでどうやるんだっけ？
ということでチートシートを作成しました。すぐさま実行出来るコード付き。

# Kotlinって何？
<details><summary>KotlinはJavaプラットフォーム上の新しい言語で、Javaとの互換運用が可能な静的型付き言語。</summary>「実用主義、簡潔、安全」を目指した言語であり、Javaよりもシンプル、そしてJavaで陥りがちなミスを未然に防いでくれる実用的な言語である。
Javaとの相互運用性があるため、Javaのプログラムを簡単にKotlinから利用することが可能。Java経験者にとって学習コストが小さいのも魅力だ。
</details>


# Kotlinデータタイプ
| タイプ | ビット幅 | 種類 | 例 |
|:--|--:|:-:|:--|
|Double	|64|浮動小数点|12345.6|
|Float	|32|浮動小数点|12345.6f|
|Long	|64|整数|123456L 999_99_9999L 0xFF_EC_DE_5E|
|Int	|32|整数|123456 0xFF_FF|
|Short	|16|整数|32767 0x0F|
|Byte	|8 |整数|127 0b1010|
|String	| - |文字列|"Hello, world!\n"|

# Kotlin変数と定数
変数 var

```kotlin
var a: Float
a = 12345.6f
```

定数 val

```kotlin
val a: Int = 10000
```

```kotlin
val b = 10_000L // アンダースコアで区切って桁を見やすくする
```

宣言と初期化は同時でなくても良い。

```kotlin
val c: Double
c = 12345.6
```

# Kotlin制御構文

## If式

```kotlin
if(true)
    println("Hello")
```

```kotlin
if(false){
    println("Hello")
} else if(true) {
    println("Kotlin")
} else {
    println("World!")
}
```

式なので結果を代入可能。最後に評価される式が返る。

```kotlin
val max = if (a > b) {
    print("a is greater than b")
    a
} else {
    print("a is less than b")
    b
}
```

## When式
```kotlin
when (a) {
    1    -> println("a == 1")
    2,3  -> println("a == 2 or a == 3")
    else -> {
        println("otherwise")
    }
}
```

inで範囲を指定。

```kotlin
when (a) {
    in 1..10   -> println("a is in the range")
    !in 10..20 -> println("a is outside the range")
    else       -> println("otherwise")
}
```

## Forループ
```kotlin
for (a in 1..10) println(a)
```

```kotlin
for (a in 'Z' downTo 'A') print(a)
```

コレクション

```kotlin
val array = arrayOf(297456, 119243,9,30)
for (a in array) {
    println(a)
}
```

インデックスを使いたい場合

```kotlin
val array = arrayOf(297456, 119243,9,30)
for (i in array.indices) {
    println(array[i])
}
```

## Whileループ

Javaと同じ。

```kotlin
var x = 10
while (x > 0) {
    println(x--)
}
```

do-while

```kotlin
do{
  println("i = " + i--)
}while(i > 4)
```

# Kotlinデータ変換

文字列を数値へ

```kotlin
val intVal: Int = str.toInt()
val intValOrNull: Int? = str.toIntOrNull()
val doubleVal = str.toDouble()
```

各タイプから文字列へ

```kotlin
val intStr = num.toString()
```

数値のキャスト（例：IntからLongへの変換）

```kotlin
val long= int.toLong()
```

# 日付の処理

[日付処理](https://qiita.com/emboss369/items/5a3ddea301cbf79d971a)


# Kotlin算術演算子

Javaと同じ

| 使用例 | 意味 | 使用例 | 意味 |
|:-:|:-:|:-:|:-:|
|x + y|加算   |x - y   |減算   |
|x * y   |乗算   |x / y   |除算   |
|x % y   |剰余   |   |   |
|++x / x++   |インクリメント   |--y / y--   |デクリメント   |

# Kotlinブール演算子

Javaと同じ

a && b (and) 
a &#124;&#124; b (or)
!a (not)

# Kotlin文字列

```kotlin
    val multiline = """
    for (c in "foo"){
        print(c)
    }
    """
```

```kotlin
    val withTrim = """
    |for (c in "foo"){
    |    print(c)
    |}
    """.trimMargin()
```

# Kotlin文字列テンプレート

```kotlin
val str = "Hello Kotlin!"
val templete = " $str is ${str.length} characters."
// >Hello Kotlin! is 13 characters.
```

$をそのまま出力したい時

```kotlin
val price = 200
val multiline = """
|This is ${'$'}$price.
""".trimMargin()
````
[オンラインで実行](https://try.kotlinlang.org/#/UserProjects/r2mqvn38l7sber092857up914n/2l7hqklk1pmsijshs10aui1bu1)


# Kotlin比較演算子

ほとんどJavaと同じだが、「==」はJavaのequalsと同等。オブジェクト比較はKotlinでは「===」になる。

| 使用例 | 意味 | 使用例 | 意味 |
|:-:|:-:|:-:|:-:|
| x < y | xが小さい | x <= y | xが小さいまたは同じ |
| x > y | xが大きい | x >= y | xが大きいまたは同じ |
| x == y | 同じ | x != y | 異なる |
| x === y | オブジェクトが同じ | x !== y |オブジェクトが異なる|

# Kotlin文字列関数

| 例 | 意味 |
|:--|:--|
| s.length  | sの長さ  |
| s.count()  | sの長さ  |
|s[i]|i番目の文字|
|s.substring(start..end)|startからendまでの部分文字列|
|s.substring(start,end)|startからend-1までの部分文字列|
|s.toUpperCase()|大文字変換|
|s.toLowerCase()|小文字変換|
|s.indexOf('x')|'x'が最初に出現するインデックス|
|s.replace(old,new)|文字列の置き換え|
|s.replaceFirst(old,new)|最初に見つかった文字列の置き換え|
|s.split(regex)|分割する|
|s.trim()|前後のホワイトスペースを除去|
|s.startsWith(prefix)|文字列がfrefixで始まるならtrueを返す|
|s.endsWith(suffix)|文字列がsuffixで終わるならtrueを返す|

# Kotlinコレクション

## List

読み取り専用List

```kotlin
val items = listOf(1, 2, 3)
println(items)
```


変更可能なList

```kotlin
val numbers: MutableList<Int> = mutableListOf(1, 2, 3)
numbers.add(4)
```

## Set

読み取り専用Set

```kotlin
var strings: Set<String> = setOf("A","B","C")
```

変更可能なSet

```kotlin
var stringSet: MutableSet<String> = mutableSetOf("x","y","z")
stringSet.add("a") 
stringSet.filter { it != "x"}
```

## Map

読み取り専用Map

```kotlin
val fruits = mapOf("apple" to 1, "orange" to 2, "banana" to 3)
```

変更可能なMap

```kotlin
val readWriteMap = mutableMapOf("apple" to 1, "orange" to 2, "banana" to 3)
readWriteMap.put("melon",4)
```


# Kotlin関数
Kotlinの関数はキーワードfunで定義する

```kotlin
fun times(a: Int, b: Int): Int {
    return a * b
}
```

関数の実行

```kotlin
val result = times(2,5)
```
[オンラインで実行](https://try.kotlinlang.org/#/UserProjects/7ipoghpd4rm475oncc8tdnmj8b/rvavpm8nfm0drgrgv5p37fd0fe)

関数本体が1つの式で構成される場合は中括弧を省略し=の後ろに式を書く事ができる。戻り値は推論により省略可能。

```kotlin
fun times(a: Int, b: Int) = a * b
```
引数にはデフォルト値を指定可能。関数を呼び出す時、引数の名前を指定可。

```kotlin
val result = makeString(base = "world ", concl = "of Kotlin!")
```




# Kotlinクラス

```kotlin
open class Parent{
    open fun show() = println("This is Parent")
}
class Child:Parent(){
    override fun show() = println("This is Child")
}
```

イニシャライザ：初期化コードはinitブロックを使用する

```kotlin
class Person(val name: String, val isMan:Boolean, var favorite:String ){
    init {
        val s = if(isMan) "He" else "She"
        favorite =  "$s liles $favorite"
    }
}
```


# Kotlinデータクラス
data class と定義することでequals、hashCode、toString、copyが自動生成される。

```kotlin
data class Dog(val name: String)
```

# オブジェクト式
Javaの無名クラスにあたる機能。
object:継承Class(Interface)名{実装}

```kotlin
view.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?) {
        view.text = "clicked"
    }
})
```

# Kotlinラムダ式

```kotlin
{変数:型 -> 処理}
```

ラムダ式は変数に格納できる

```kotlin
val minus = {x: Int, y: Int -> x - y }
```

ラムダ式の引数が1つの場合、引数を省略し暗黙の引数itが使える

```kotlin
val double:(Int)->Int = {it * 2}
```

# Javaとの相互運用

java.lang.Classを取得するにはClassName::class.javaまたはinstance::class.javaを使う

```kotlin
val clazz = Activity::class.java
val clazzz = this::class.java
```