すきま風

勉強したことのメモとか

data classのtoString()で特定のフィールドを隠蔽する

https://mustafaali.net/2018/01/14/Kotlin-data-classes-and-sensitive-information/
ラッパークラスにしてあげると良い。

class ProtectedProperty<T>(var value: T) {
    override fun toString() = "███████████"
}

data class Customer(
    val name: String,
    val password: ProtectedProperty<String>
)

val customer = Customer("user", ProtectedProperty("123"))

println(customer) // => Customer(name=user, password=███████████)

いつかどこかで使うケースが出てきそうなのでメモ

build.gradle.ktsに移行する! Tips編

以前記事にしたプロジェクトをbuild.gradleからkotlin-dslに移行します。
build.gradle.ktsにすることでスクリプト内でKotlinを使えるようになるし、IntelliJの補完が賢くなるし、groovyの文法をいちいちググらなくてよくなります。Spring Initializrでのデフォルトもktsになっていますし、やるしかねえぞこれ

で、気合で一気にやりました。変換結果はこちら

以下、自分用のメモとしてTipsを記載しておきます。

続きを読む

build.gradle.ktsに移行する! 変換編

以前記事にしたプロジェクトをbuild.gradleからkotlin-dslに移行します。プロジェクト構成などについてはそちらを参照ください。

Spring Boot 2.2.0のリリースに伴いコードを書き直しました (最終更新: 2019/11/14)

※ リンクの記事はspring-data-r2dbc などを入れていますが、これだとdependencyManagementを入れた場合バージョン違いで動かないので、一旦リアクティブなDBアクセスの部分 (adapters.persistence) は外しました。

.gradleファイルと.gradle.ktsファイルは共存できるので、一つずつ変換していくと楽です。
この記事とは別に、Tipsを別記事にまとめています。

続きを読む

Kotlin groupingByって便利だね 2

問題: 生徒オブジェクトのリストがあり、性別ごとの所持金額を集計する

data class Student(
    val name: String,
    val gender: Gender,
    val wallet: Int
)

enum class Gender {
    MALE,
    FEMALE
}

val students = listOf(
    Student("foo", MALE, 1000),
    Student("bar", MALE, 100),
    Student("fizz", FEMALE, 200),
    Student("buzz", FEMALE, 300)
)

解答

val map = students.groupingBy { it.gender }.fold(0) { price, student ->
    price + student.wallet
}

println(map) // -> {MALE=1100, FEMALE=500}

foldの使い方をよく忘れるのでメモ

Kotlin groupingByって便利だね

問題: 生徒オブジェクトのリストがあり、クラスごとの人数を集計する

data class Student(
    val classNumber: String,
    val name: String
)

val students = listOf(
    Student("1-1", "foo"),
    Student("1-1", "bar"),
    Student("1-1", "fizz"),
    Student("1-2", "buzz"),
    Student("1-2", "fuga"),
    Student("1-3", "hoge")
)

解答: groupingByを使う

val count = students.groupingBy { it.classNumber }.eachCount()
println(count)  // => {1-1=3, 1-2=2, 1-3=1}

年に2回くらい使いたくなるが、そのたびに忘れるのでメモ。

Kotlin Coroutineのerror handlingを理解する

Kotlin Fest 2019 での Kotlinコルーチンを理解しよう 2019 が素晴らしかったので、忘れないうちに復習することにします。
サンプルプログラムは前回記事にしたクリーンアーキテクチャのコードを利用しています。

続きを読む