こんな文字列があるとする:
val s1 = "foo" val s2 = ""
これを、以下のような感じにしたいことはまあまあある:
val s1a = Some("foo") val s2a = None
つまり、以下のようなルールだ:
- 文字列sが空の場合、
None
。 - それ以外の場合は、
Some(s)
。
素朴にmatch
を使うこともできる:
s1 match case "" => None case s => Some(s)
しかしOption
にはfilter
とfilterNot
があるので、先にOption
にしてからfilter
すると素直に書ける:
Some(s1).filter(_.nonEmpty)
// equivalent
Some(s1).filterNot(_.isEmpty)
Catsを使っている場合は、.some
を使える:
import cats.syntax.all.{*, given}
s1.some.filter(_.nonEmpty)
あわせて読みたい
逆のパターンはCatsで素直に書くパターンがある。
追記
Option.when
を使う解法もあるとのこと。こっちのが素直でよさそう。
自分は Option.when(s.nonEmpty)(s) を使うことが多いですねー
— かにかま@脂肪肝 (@ka2_kamaboko) 2025年2月3日
Option.when(s.nonEmpty)(s)