По сути, я ищу самый похожий на скалы способ сделать следующее:
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
Однако для суммирования более двух вариантов мне пришлось бы использовать слишком много if
s или использовать какой-то цикл.
EDIT-1:
При написании вопроса я придумал что-то вроде ответа:
def sum2(value1: Option[Int], value2: Option[Int]): Option[Int] =
value1.toList ::: value2.toList reduceLeftOption { _ + _ }
Этот выглядит очень идиоматичным для моего неопытного глаза. Это будет работать даже с более чем двумя значениями. Но можно ли сделать то же самое без преобразования в списки?
EDIT-2:
Я получил это решение (спасибо ziggystar ):
def sum(values: Option[Int]*): Option[Int] =
values.flatten reduceLeftOption { _ + _ }
EDIT-3:
Еще одна альтернатива благодаря Landei :
def sum(values: Option[Int]*): Option[Int] =
values collect { case Some(n) => n } reduceLeftOption { _ + _ }