[書評]Kotlin Cookbookを読んだ。6章~13章

[書評]Kotlin Cookbook 1章~5章まで
の続編

以下、後半


・今回の内容
6. Sequences
7. Scope Functions
8. Kotlin Delegates
9. Testing
10. Input/Output
11. Miscellaneous
12. The Spring Framework
13. Coroutines and Structured Concurrency

 

・ループで時間がかかる処理
クソコード
全部のコードをmapして
全部のコードをfilterして
firstを取る

(100 until 2_000_000).map { println(it*2); it * 2 }
.filter{ println(it);it % 3 == 0}
.first()

クソコード2
多少マシになったが
全部のコードをmapして
firstを取る

(100 until 2_000_000).map { println(it*2); it * 2 }
.first{ println(it);it % 3 == 0}

asSequenceにすると
100が全部処理されてから
101を全部処理する

(100 until 2_000_000).asSequence()
.map { println(it*2); it * 2 }
.filter{ println(it);it % 3 == 0}
.first()

 

・Delegate
observableはすべて更新

var watched: Int by Delegates.observable(1) { prop, old, new ->
println("$prop, $old, $new")
}

vetoableは該当するときだけ更新

var watched: Int by Delegates.vetoable(1) { prop, old, new ->
println("$prop, $old, $new")
new >=0
}

println(watched)
1

watched = -1
var Line_6.watched: kotlin.Int, 1, -1

println(watched)
1

 

・MapをDelegateにする

data class Project(val map: Map<String, Any?>) {
val name: String by map
}

Project(mapOf("name" to "masterka"))
res15: Line_14.Project = Project(map={name=masterka})

 

・arrayContainingInAnyOrder
順番を無視して比較する
Hamcrestというユニットテストの関数

 

・テスト用のデータ作成方法
デフォルトの値を入れるよりもFactory method作った方が良い
テストでしか使わないからね
以下が一例

data class Mock(val name:String)

fun makeMock(name:String = "masterka") = Mock(name)

 

・JUnit5のParameterizedTest
csv形式のParameterizedTestもある

@ParameterizedTest
@CsvSource({
"1, 1",
"2, 2",
"3, 3",
"4, 4"
})
fun a(x:Int, y:Int)

 

・Kotlinでファイルの読み書き
readText
writeText
がある

 

・Kotlinのバージョン確認方法

println(KotlinVersion.CURRENT)
1.3.71

 

・TODO
KotlinはTodoがメソッドとして定義されてるので
呼ばれるとException吐いてクラッシュする

TODO("aaaa")
kotlin.NotImplementedError: An operation is not implemented: aaaa

 

・Springboot
springだと全部openじゃないといけないとか制約がある
この辺は、springintializr使えば自動でいい感じにしてくれるので楽
一緒に読み込んでるライブラリはこんな感じ

kotlin("jvm") version "1.3.71"
kotlin("plugin.spring") version "1.3.71" //Kotlin Spring plug-in

freeCompilerArgs = listOf("-Xjsr305=strict") //jsr305対応

 

・JPA
以下をつけるとKotlinを使う上で困る問題が解消される

kotlin("plugin.jpa") version "1.3.71"

 

・Coroutine
GlobalScopeじゃなくてCoroutineScope使えよ

 

本書はとてもためになりました
Kotlinを使ってる人には、次なる一歩を導く一冊だと思います

関連記事:

Pocket