nullable => Optional
Kotlin でコードを書いていると、 Java の Optional に変換する必要が出てきます。
そういった場合は Optional.ofNullable
を使って Optional
に変換します。
nullable でなければ Optional.of
を使うこともできます。
サンプル
class SecurityAuditorAware: AuditorAware<Long> {
override fun getCurrentAuditor(): Optional<Long> {
val authentication = SecurityContextHolder.getContext().authentication
if (authentication == null || !authentication.isAuthenticated) {
return Optional.ofNullable(null)
}
return Optional.ofNullable((authentication.principal as UserDetail?)?.user?.id)
}
}
Java から見たら Kotlin の nullable はそうでないものと同じものに見えるので、 Optional<Long?>
も Optional<Long>
も Optional<Long>?
も Optional<Long?>?
も同じです。 サンプルにある getCurrentAuditor()
の返り値の型には それらの 4パターンを使うことができます。
Optional => nullable / not-nullable
Spring 5 の リポジトリ で findById
を使うと、 Optional<T>
が返ってきます。
そういう場合に Kotlin に値を渡すために Optional
から中身を取り出したいことがあります。
optionalValue.get() => not-nullable
optionalValue.orElse(null) => nullable
その他
Optional
型 の値にはほかにもさまざまなmethodが用意されています。
次の記事に詳しく記載されていました。
https://qiita.com/tasogarei/items/18488e450f080a7f87f3