Вы можете использовать Option
flatMap
и map
методы для комбинирования двух Option
с, так что результат будет Some(f(x,y))
, если два Option
с Some(x)
и Some(y)
или None
в противном случае.
entities.foldLeft(Some(0.0):Option[Double]) {
(acco, x) => acco.flatMap(acc => x.quantity.map(_ + acc))
}
Изменить в ответ на ваши комментарии:
Вот пример использования:
scala> case class Foo(quantity:Option[Double]) {}
defined class Foo
scala> val entities: List[Foo] = List(Foo(Some(2.0)), Foo(Some(1.0)), Foo(None))
scala> entities.foldLeft(Some(0.0):Option[Double]) {
(acco, x) => acco.flatMap(acc => x.quantity.map(_ + acc))
}
res0: Option[Double] = None
scala> val entities: List[Foo] = List(Foo(Some(2.0)), Foo(Some(1.0)))
scala> entities.foldLeft(Some(0.0):Option[Double]) {
(acco, x) => acco.flatMap(acc => x.quantity.map(_ + acc))
}
res1: Option[Double] = Some(3.0)
Так что да, он вернет None
, если какая-либо из сущностей будет None
.
Относительно map
и flatMap
:
map
принимает функцию f
типа A => B
и возвращает Some(f(x))
для Some(x)
и None
для None
.
xo.flatMap(f)
, где f
- функция типа A => Option[B]
, а xo
- Option[A]
, возвращает Some(y)
, если xo
- Some(x)
и f(x)
- Some(y)
. Во всех других случаях (то есть, если xo
равно None
или f(x)
равно None
), возвращается None
.
Таким образом, выражение acco.flatMap(acc => x.quantity.map(_ + acc))
возвращает y + acc
, если x.quantity
равно Some(y)
и acco
равно Some(acc)
. Если один или оба из x.quantity
и acco
равны None
, результат будет нулевым. Поскольку это внутри сгиба, это означает, что для следующей итерации значение acco
также будет None
, и, следовательно, конечный результат будет None
.