Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scalaで空文字列をNoneにしたいときはfilterすると良い

こんな文字列があるとする:

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にはfilterfilterNotがあるので、先にOptionにしてからfilterすると素直に書ける:

Some(s1).filter(_.nonEmpty)
// equivalent
Some(s1).filterNot(_.isEmpty)

Catsを使っている場合は、.someを使える:

import cats.syntax.all.{*, given}
s1.some.filter(_.nonEmpty)

あわせて読みたい

逆のパターンはCatsで素直に書くパターンがある。

blog.3qe.us

追記

Option.whenを使う解法もあるとのこと。こっちのが素直でよさそう。

Option.when(s.nonEmpty)(s)
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?