Kotlin 1.5.0の新しい標準機能

YouTubeでの紹介が分かりやすかったので、見ながら学習した

## YouTube

New Standard Library Features in Kotlin 1.5.0
[https://www.youtube.com/watch?v=MyTkiT2I6-8](https://www.youtube.com/watch?v=MyTkiT2I6-8)

この動画を見ながら、気になった箇所をメモしつつ、キャプチャで貼り付けていく。

だいぶ手抜きのメモなので荒いと思う。

## 符号なし整数型

UByte
UShort
UInt
ULong

これはマイナスが入らない型で、使用することによって「マイナスが入らない」という宣言にもなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/920fa17f-be88-ce0b-173c-8118efe42764.png)


**UIntは最小値が0, 最大値が40億**

Intは最小値が-20億、最大値が20億強

マイナスが入らない分、範囲をシフトしてより大きな整数を格納できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/215235d0-5099-47b1-dfea-7f089cd214d3.png)


使用時にパフォーマンスのペナルティはない

## 新しい文字列大文字化関数

`toUpperCase()`
`toLowerCase()`
`toTitleCase()`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/1df7b9d2-bea0-73cb-1488-d323ec8bad33.png)

ロケールに依存しない

便利かも

## bool値を作成する便利関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/9be8e5a2-172e-2d2b-59a5-f2541b8a0757.png)


`toBooleanStrict()`関数もある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/cf7ee79b-0726-991b-eaec-a84f52034f7b.png)


この関数はtrueとfalseをそれらにマップする

それ以外の場合は例外をスローする

`toBooleanStrictOrNull()`は正確ではない場合はnullを返す



## 文字の文字コードに変換できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/d77dc696-81c3-e4f8-8471-b465be4c1295.png)



## 文字をチェックする多くの機能（5:32）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/bf4f08d6-8d57-a69c-79e6-031db48c2df8.png)

これは便利そう


## 整数除算の新機能

マイナスの割り算用の関数ができた

#### `floorDiv()`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/1e747fee-5b58-38ac-c72c-aa138cee6fb9.png)

電卓だと、
5 / 3 = 1.666666
(-5) / 3 = -1.666666

違いはfloor除算は常に結果を丸める（切り捨て）ことです ← 🤔 ？？？



#### `mod()` という剰余関数も追加された

modはfloor除算の余りを返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/8eec3297-7742-cd58-85d4-a069ee327035.png)

Kotlinで **rem** とよばれ % 演算子とは異なる

主な違いは、結果が正か負かという符号

`mod` は負の値で呼び出された場合でも、常に負ではない値を生成する（？）

使い所は、循環データ構造で役立つらしい（よく分からん。。。）



## java.nio.file.Pathの拡張機能

Pathの文字列を便利に連結してサブパスを構築できるようになった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/839eccf1-f93e-600d-0c6c-808492973a75.png)

ファイル読み込みに便利そう


NIOパスはたくさんあるので、IDEのオートコンプリートやKotlinlang.orgのAPIドキュメントを見て欲しい


## Kotlinコレクション

例えば、以下のusersからageがnullではない値を抽出するとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/dff0a9a2-a6bd-9675-f62b-6bd768b3c1af.png)
mapNotNullとfirstOrNullを組み合わせて取得できるが、

これは別の中間リストを作成している＋チェーンを明示的にシーケンスに変換する。

Kotlin 1.5だと、もっと良い書き方ができる。

`firstNotNullOf()`　と`firstNotNullOfOrNull`

この関数では渡されたセレクターの最初のnull以外の値を返す。
要素がない場合はnullを返す




## DurationAPIの進化（8:38）

時間間隔の正確な測定を提供する
タイプセーフな方法で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/2c7a8860-ae9b-9251-4e1b-f89066302289.png)


現在、内部的にLongを使用している。

期間オブジェクトと言うらしい

# KotlinTestライブラリ

KMPとJVMの構成の改善

新しいアサーション関数の登場

値の型を確認するために、 `assertIs<T>()` と `assertIsNot<T>()` を使用できるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/f6f869e2-ada3-8eea-2f6d-4efa302e3fd6.png)

コレクション、シーケンスなどは `assertContentEquals()`で比較できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/decc4b4f-2102-afb7-dc2f-1a17d54bfecb.png)

**期待される引数と、実際の引数に、同じ要素が同じ順序で含まれているかどうか？**
を判定できる。

## doubleとfloatのアサーションも改善された

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/2ef4cd12-2f06-ecb9-2f19-b29da39d4658.png)

## 備考

日本語版の公式ブログもあるので、正直そちらのほうが分かりやすいと思った
https://blog.jetbrains.com/ja/kotlin/2021/04/kotlin-1-5-0-rc-released-ja/

今回はYouTubeから学習してoutputしたチャレンジングな記事だった