基本的に、私は次のことを行うための最もスカラのような方法を探しています:
def sum(value1: Option[Int], value2: Option[Int]): Option[Int] =
if(value1.isDefined && value2.isDefined) Some(value1.get + value2.get)
else if(value1.isDefined && value2.isEmpty) value1
else if(value1.isEmpty && value2.isDefined) value2
else None
これにより、正しい出力が得られます。
sum(Some(5), Some(3)) // result = Some(8)
sum(Some(5), None) // result = Some(5)
sum(None, Some(3)) // result = Some(3)
sum(None, None) // result = None
しかし、3つ以上のオプションを合計するには、あまりにも多くif
のsを使用するか、ある種のループを使用する必要があります。
編集-1:
質問を書いている間、私はある種の答えを思いついた:
def sum2(value1: Option[Int], value2: Option[Int]): Option[Int] =
value1.toList ::: value2.toList reduceLeftOption { _ + _ }
これは私の経験の浅い目には非常に慣用的に見えます。これは、3つ以上の値でも機能します。それでも、リストに変換せずに同じことを行うことは可能ですか?
編集-2:
私はこの解決策に行き着きました(ziggystarのおかげで):
def sum(values: Option[Int]*): Option[Int] =
values.flatten reduceLeftOption { _ + _ }
編集-3:
Landeiのおかげで別の選択肢:
def sum(values: Option[Int]*): Option[Int] =
values collect { case Some(n) => n } reduceLeftOption { _ + _ }