如何在Scala中总结两个Option [Float]?
例如:
Option[Float](1.5f) + None = 1.5f
Option[Float](2.3f) + Option[Float](1.2f) = 3.5f
当然,由于+
方法需要String
答案 0 :(得分:1)
通过元组上的模式匹配:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
<div>
<input type="checkbox" name="fruit" value="orange" id="orange">
<label for="orange">orange</label>
</div>
<div>
<input type="checkbox" name="fruit" value="apple" id="apple">
<label for="apple">apple</label>
</div>
<div>
<input type="checkbox" name="fruit" value="banana" id="banana">
<label for="banana">banana</label>
</div>
<div id="log"></div>
</form>
,或使用选项val addOptions = (o1: Option[Float], o2: Option[Float]) => (o1, o2) match {
case (Some(v1), Some(v2)) => Some(v1 + v2)
case (None, v@Some(_)) => v
case (v@Some(_), None) => v
case (None, None) => None
}
addOptions(Some(1.2f), None)
----
res3: Option[Float] = Some(1.2)
:
.fold
然后你也可以通过在折叠列表时传递函数来添加n个项目。
val addOptions = (o1: Option[Float], o2: Option[Float]) =>
o1.fold(o2)(v1 => o2.fold(o1)(v2 => Some(v1 + v2)))
你也可以使用val lst = List[Option[Float]](Some(1.5f), None, Some(2f))
lst.foldLeft(None: Option[Float]) { (acc, item) =>
addOptions(acc, item)
}
库(https://github.com/typelevel/cats)或类似的东西:
cats
import cats.implicits._
val a: Option[Float] = Some(2f)
val b: Option[Float] = Some(2f)
a |+| b
----
res2: Option[Float] = Some(4.0)
只是Semigroups的合并运算符(https://en.wikipedia.org/wiki/Semigroup)
答案 1 :(得分:0)
简单的方法是创建一个函数
NSFetchRequest *f = Departament.fetchRequest;
f.predicate = [NSPredicate predicateWithFormat:@"ANY employees = %@", employe.objectID];
并致电 添加(一些(1.5F),无)
答案 2 :(得分:0)
您可以使用get
方法获取nonEmpty Option
的值。
scala> Option[Float](2.3f).get + Option[Float](1.2f).get
res0: Float = 3.5
如果Option
为空,则会抛出java.util.NoSuchElementException
。
scala> Option[Float](2.3f).get + Option.empty[Float].get
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:349)
at scala.None$.get(Option.scala:347)
... 29 elided
所以最安全的方法是使用getOrElse
,因为@Kolmar也评论了
scala> Option[Float](2.3f).getOrElse(0f) + Option[Float](1.2f).getOrElse(0f)
res2: Float = 3.5
scala> Option[Float](2.3f).getOrElse(0f) + Option.empty[Float].getOrElse(0f)
res3: Float = 2.3
我希望答案很有帮助
答案 3 :(得分:0)
在这种情况下,cats库会使事情变得如此简单,但以防万一您无法使用它,这是一个可行的选择:
def reduce(v1: Option[Float], v2: Option[Float]): Option[Float] =
v1.flatMap( x => v2.map(y => x + y).orElse(v1))
def sum(v1: Option[Float], v2: Option[Float]): Option[Float] = {
if(v1.isDefined)
reduce(v1, v2)
else
reduce(v2, v1)
}
您只需调用sum即可添加两个Float:
sum(Some(22),Some(22))