【Kotlin/Android】Result型の使い方!runCatchingとは?
この記事からわかること
- Android Studio/KotlinのResultの使い方
- onSuccess/onFailureの実装方法
- runCatchingとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Result型
inline class Result<out T> : Serializable
KotlinのResult
型は操作の結果をラップして保持できるデータ型です。成功した際には指定したデータ型の値を失敗した際には例外を保持することができます。
結果を返すメソッドなどで返り値として使用されることが多く、成功時の失敗時のエラーハンドリングが行いやすくコードの見通しもスッキリさせることができます。
使い方
Result
型をメソッドの返り値として指定する場合はResult.success
で成功した場合のデータを、Result.failure
で例外を返します。
private fun fetchLocalData(): Result <String> {
if (true) {
return Result.success("データ")
} else {
return Result.failure(Error("ERROR"))
}
}
onSuccess/onFailure
取得したResult
型からはonSuccess
で成功した場合の処理を、onFailure
で失敗した場合の処理を記述することができます。
val result = fetchLocalData()
result
.onSuccess { data ->
println(data)
}.onFailure { error ->
println(error)
}
isSuccess/isFailure
isSuccess
で成功しているかどうかを、isFailure
で失敗しているかどうかを取得することができます。
result.isSuccess
result.isFailure
getOrNull/exceptionOrNull
getOrNull
で値があれば取得なければnullを、exceptionOrNull
でエラーがあれば取得なければnullを取得することができます。
val value = result.getOrNull()
val error = result.exceptionOrNull()
getOrDefault/getOrElse
getOrDefault
で値があれば取得なければ指定したデフォルト値を、getOrElse
で値があれば取得なければデフォルト値をラムダ式で返却し取得することができます。
val value = result.getOrElse { "デフォルト値" }
val value = result.getOrDefault("デフォルト値")
getOrThrow
getOrThrow
で値があれば取得、エラーなら例外をスローすることができます。
try {
// 成功している場合、値を取得
val value = successResult.getOrThrow()
println("Success: $value") // "Success: Hello, World!"
} catch (e: Exception) {
// 失敗している場合、例外をキャッチ
println("Error: ${e.message}")
}
fold
fold
で成功時と失敗時の処理をそれぞれ指定し、その結果を返すことができます。
val msg = result.fold(
onSuccess = { value -> "Success: $value" },
onFailure = { error -> "Error: ${error.message}" }
)
recover
recover
で失敗時に指定した値を返すことができます。
val value = result.recover { "失敗した時に返したい値" }
runCatching
Result型を簡単に利用する方法にrunCatching
があります。runCatching
メソッドは指定したラムダ式を実行しその結果をResult
型で返します。ブロックが正常に完了した場合は成功としてResultにラップされ、例外が発生した場合は失敗としてResultにラップされます。
val successResult = runCatching {
"Hello, World!"
}
println(successResult) // Result.success(Hello, World!)
// 失敗する場合
val failureResult = runCatching {
throw Exception("Something went wrong")
}
println(failureResult) // Result.failure(java.lang.Exception: Something went wrong)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。