如何在scala中总结两个Option [Float]

时间:2017-11-10 13:52:38

标签: scala

如何在Scala中总结两个Option [Float]?

例如:

Option[Float](1.5f) + None = 1.5f
Option[Float](2.3f) + Option[Float](1.2f) = 3.5f

当然,由于+方法需要String

,因此提供的示例不起作用

4 个答案:

答案 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))