高専生に贈るKotlin入門【布教編】

# Kotlinの特徴的なものを勝手に選んでご紹介
:::note warn
JavaやC#,C++,Pythonなど他の言語経験者向けです。
機能の説明がしやすいように例を書いているのでこの使い方が正しい保証はありません。
機能の理解をしてくれればそれでOKです
:::

https://qiita.com/naotikiKt/items/27d03120fb2e9e8372d5

↑前回
## 変数宣言
Kotlinでは基本的に`val`で変数を宣言します。
[前回]は便宜上`var`を使用しましたが、再代入はバグの元ですもんね！！
型推論も、もちろんしてくれます。
```kotlin
val greeting = "やぁ"//自動でString型
greeting = "はろー"//エラー！！！ 再代入だめ！！
```
[前回]:https://qiita.com/naotikiKt/items/27d03120fb2e9e8372d5
## データクラス
```kotlin
data class Config(var enable:Boolean,var name:String,var value:Int)

Config(true,"A",1) == Config(true,"A",1)//true
```
数値や文字列のように`==`で比較ができます。
インスタンスが異なってもプロパティが等しければ`true`それ以外で`false`です。
## 拡張関数
簡単に既存の型に関数を追加できます。
```kotlin
fun String.addFace(){
    return this+"^-^)v"
}
"こんにちは".addFace()//"こんにちは^-^)v"
```
## ラムダ式
みなさん大好きラムダ式ですよ！
ラムダ式はこのように書くことができます。
```kotlin
//引数なし、返り値なし
val func1:()->Unit={
    println("Hi")
}
//返り値あり
val func2:()->Int={
     19*3 //returnは要らない
}
//引数あり
val func3:(String)->Unit={
    println("引数は $it")
}
val func4:(String,Int)->Unit={str,n->
    println("引数は $str と $n")
}

val func5:String.()->String={
    this+"^-^)b"
}
```
`Unit`は他の言語で言うVoidみたいなものです。何も返さないときに使いましょう。
`func3`以降が特徴的ですね。Kotlinではラムダ式の引数名を省略でき、`it`を使用できます。(引数が複数の場合は不可)
`{変数名-> 処理}`で名前を明示的につけることも可能です。
`func5`は拡張関数のラムダ式版です。
`()=>{}`みたいに長くなくてスッキリしてますね！
```kotlin
fun runFunc(func:()->Unit){
    func()
}

runFunc({
    println("らむだ")
})
// ↓
runFunc{
    println("()が無くてもいいんですか！？")
}
```
Kotlinは要らない括弧を省略できるので更にスッキリしますね！！
## スコープ関数
私が一番好きな機能です。ですがわかりやすい使用例が思いつきません・・・とりあえず使用例を書きました
```kotlin
data class Config(var enable:Boolean,var name:String,var value:Int)
fun getConfig()=Config(true,"Config!!!",1)
fun setConfig(config:Config)=TODO("なんか処理が走る")

fun main(){
    val config=getConfig()
    config.enable=false
    config.value=100
    setConfig(config)
}
```
なんで`config`って何回も書かないといけないの・・？しかもわざわざ`setConfig()`一回のためだけに変数宣言するのいやだなぁってなりますが・・・
```kotlin
fun main(){
    setConfig(getConfig().apply{
        enable = false
        value = 100
    })
}
```
はい好き。優勝です。`apply`くんは`.`の前(この場合`getConfig()`)を引数のラムダ式の`this`に入れてくれます。
そして最後に変更されたものを返してくれます。(enable=false,value=100になった`getConfig()`)
thisは省略できるのでスッキリした見た目になりますね～

他にも仲間はいっぱいいます！

https://kotlinlang.org/docs/scope-functions.html


## コレクション(配列)
Kotlin標準ライブラリのコレクション関連機能はひじょーに充実してます
### List
配列のことです。`listOf()`で生成できます。
```kotlin
val classes = listOf("数学Ⅱ","国語","英語","化学")
subjects[3] // "化学"
subjects[0] = "数学Ⅲ"//エラー 書き換え不可
```
### Set
Setは同じ要素を持てません。含めようとしても自動で削除されます。
作成するには`setOf()`です。
```kotlin
val numbers = setOf(1,5,3,2,5) //[1,5,3,2]
```
`.toSet()`でListをSetに変換できます。
### Map
Mapは配列のインデックスの代わりに任意のキーを使用できます。JSONみたいなかんじですね！
`mapOf()`を使います。
```kotlin
val numbersMap = mapOf("one" to 1,"two" to 2 ,"three" to 3)
numbersMap["two"]// 2
```
### mutable
これらのコレクションはデフォルトでは書き込み(追加、削除、変更)不可ですが`mutable`とすると追加、削除、変更などができるようになります。
```kotlin
val classes = mutableListOf("数学Ⅱ","国語","英語","化学")
val numbers = mutableSetOf(1,5,3,2,5)
val numbersMap = mutableMapOf("one" to 1,"two" to 2 ,"three" to 3)
```
### コレクションに使える便利なやつらを一気に紹介
```kotlin
val numbers = listOf(1,2,3,4,5,6,7,8,9)
//trueになるものを絞り込む
numbers.filter{it % 2 == 0}
//最初・最後の要素を取得
numbers.first()
numbers.last()
//n個の要素を除外して返す
numbers.drop(2)
numbers.dropLast(3)
//ランダムに取得
numbers.random()

//含まれているか確認
0 in numbers // false
numbers.contains(7) // true
```
全部書くと私が死んでしまうので一部だけ紹介しました！
ほかにもたくさんあります！

https://kotlinlang.org/docs/collections-overview.html

## Null安全
Kotlinはnull安全な言語なので「ぬるぽ」(NullPointerException)に怯える必要はありません。
KotlinではNullを許容することを明言しない限りNullは代入出来ません。
明言するには、型の後ろに`?`をつけます。
```kotlin
//数字かもしれないしnullかもしれん
val maybeNumber:Int? = readln().toIntOrNull()
maybeNumber+=123//エラー！！ nullかもしれない
if(maybeNumber != null){
    //nullで無いことが保証されInt型になる
    maybeNumber+=123
    println(maybeNumber)
}
```
`nullかもしれないやつ!=null`をしてあげることによってnullでは無いことがわかるので以降コンパイラはnullが入っていないものとして処理をします。賢い！！！
### 安全な呼び出し
```kotlin
val a = "Kotlin"
val b: String? = null
println(b?.length) // nullが出力される
println(a?.length) // 6が出力されるがIntelliJには必要ないよって言われる
//このように繋げることもできる
//どこかでnullになるとnullが返される
b?.length?.times(3)
```
`?.`でnullを考慮して安全に関数を呼び出せます。安全確認ヨシ！！
### エルビス式
nullじゃないときはその値を、そうでないとき、別の値を返したいときはこれ！！
```kotlin
val a:Int? = null
val b:Int = a ?: -1
val c:Int = if(a != null) a else -1//同じ意味
```

### Null安全との合わせ技
Null安全を活かした便利な関数もあります。
```kotlin
//空ならfirst()は無いのでnullを返す
emptyList<String>().firstOrNull()

//Intに変換不可なのでnullを返す + エルビス式でnullなら-1になる
"A".toIntOrNull() ?: -1
```
スコープ関数の`let`を使うと・・？
```kotlin
fun usefulFunc(r:Int):Double{
    return r*r*PI
}

fun main(){
    println("円の半径を入れてください")
    val S:Double? = readln().toIntOrNull()?.let{ usefulFunc(it) }
    if (S!=null){
        println("円の面積は$S")
    } else {
        println("整数で入力してください")
    }
}
```
`?.`で`toIntOrNull()`がnullじゃないときに`let`内の`usefulFunc(it)`が実行されその結果が返されます。

#### 非nullを強制する`!!`
`?.`に似た`!!`がありますがこれはあまり使用しないことが望ましいです。
ぬるぽを愛する方、ぬるぽに会いたくなったときのみ使いましょう。
```kotlin
    try {
        val number = readln().toIntOrNull()
        val sum = number!! + 123
    }catch (e:NullPointerException){
        println("おぬるぽ… 雅……ッ")
        e.printStackTrace()
    }
```

## staticがない！？！？！？
少し語弊があるかも知れませんがKotlinにstatic(修飾子)はありません。
代わりに`object`を使います。
```kotlin
//パターン1
object Naotiki{
    val favoriteLang="Kotlin"
}
Naotiki.favoriteLang // "Kotlin"
//パターン2
class SomeManager{
    fun someFunction()=println("なんかする")
    companion object{
        private var instance : SomeManager?=null
        fun getInstance(): SomeManager {
            return instance?: SomeManager().also { instance=it }
        }
    }
}

SomeManager.getInstance()

```
classの中で使うときは`companion object`です！！

## 中置関数

```kotlin
/*
Pairは２つの値をまとめられる
a.first
a.second のように使う
*/
val a:Pair<Int,Int> = x to y

for(i in 0 until 10){ ... }
```
`to`や`until`は**中置関数**と呼ばれるもので`.`や`()`を省略して呼び出せます。
宣言時には
```kotlin
infix fun Int.shl(x: Int): Int { ... }

5 shl 1 shl 6
```
のように拡張関数(またはメンバー関数)であり引数を常に一つとるようにしなければいけません

変な使い方をするとこんなものもできます。

https://qiita.com/naotikiKt/items/b56aeefcdbf1609a5d62

# 便利な公式ライブラリなど
## kotlinx.coroutines
非同期処理などを簡単に実現できます。

https://github.com/Kotlin/kotlinx.coroutines

## kotlinx.serialization
データクラスなどを簡単にJSONやその他形式にしたり、逆に戻すこともできます。

https://github.com/Kotlin/kotlinx.serialization

## kotlinx-cli
CLIアプリケーションを容易に作れるようにします。

https://github.com/Kotlin/kotlinx-cli

## kotlinx-datetime
日付などを扱いやすくします。

https://github.com/Kotlin/kotlinx-datetime

## compose-jb
Androidで使われているUIフレームワークをデスクトップアプリやWebでも使えるようにしたものです。
Kotlinで簡単にGUIアプリを作れるようになります。

https://github.com/JetBrains/compose-jb

# おわり
紹介しきれなかったものもたくさんあり、実際につかってみないと便利さがわからないものもあります。
少しでも気になったら是非！Kotlinを始めましょう！

https://qiita.com/naotikiKt/items/8cfe0364eff557d7a460