在詹姆斯·伊里的博文中,他写道:
另外,Scala有一个"选项"方法,可以将值提升为Some(value)或None,具体取决于它是否为null ...
我似乎无法option在scaladoc中的任何地方找到此方法.
Iulian Dragos的gdata客户端项目包含一个可能是James所指的方法.
def option[A <: AnyRef](a: A): Option[A] =
if (a eq null) None else Some(a)
Run Code Online (Sandbox Code Playgroud)
请指出在scaladoc中我可以在哪里找到此方法.
PS我有一个看起来像这样的方法:
def permutations(s: String): List[String] = ...
Run Code Online (Sandbox Code Playgroud)
我有两个想法,我是否应该改为:
def permutations(s: Option[String]): List[String] = ...
Run Code Online (Sandbox Code Playgroud)
因为客户端可以调用它null.目前在第一个实例中,我希望使用option前面提到的方法手动将String参数&I框化.
对于潜在的运行时故障,如数据库查询,似乎必须使用某种形式Either[String, Option[T]]才能准确捕获以下结果:
选项根本没有足够的选择.
我想我需要潜入scalaz,但是现在它是直的,除非我在上面遗漏了什么.
我自己已经被逼进一个角落,我的DAO实现,只能采用无论是写操作,但我现在看到的是一些要么写取决于期权读取(如检查,如果新用户注册存在的电子邮件),这是majorly不好赌博,使.
在我全力以赴之前,是否有人有替代解决方案来处理成功/失败/异常的运行时三连胜?
我想知道是否有一个简短的手来折叠选项的地图.例如
def divideByThree(x:Int) = if (x == 0) None else Some(x/3)
val result = Some(6) map (divideByThree(_))
resut:Option[Option[Int]] = Some(Some(2))
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题我做了
val result = Some(6) match {
case Some(i) => divideByThree(i)
case None => None
}
Run Code Online (Sandbox Code Playgroud)
这看起来有点沉重.我可以在Option上创建一个隐式函数map mapOption来解决这个问题,但我想知道是否有一种我没有想过的更好的方法.
我知道 Some 对象可以是 None 或我传递的对象之一。鉴于它不是 None 的事实,从 Some 对象中提取字段的理想方法是什么?我制作了一个“At”类,它的字段之一是“日期”。由于 Some 类具有与 Product 特征的混合,因此以下工作正常:
(An object with return type Some(At)).productElement(0).asInstanceOf[At].date
Run Code Online (Sandbox Code Playgroud)
但是有没有一种理想的方法来做到这一点?
我正在尝试做一些似乎应该在scala中具有直接语法/功能的东西.我只是不知道那是什么.我正在尝试将Option的包含值(如果它不是None)转换为另一种类型.
如果我想实现以下功能,我想知道代码是什么
def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
//Code I need goes here
}
Run Code Online (Sandbox Code Playgroud)
注意:我实际上并没有实现这个功能,它只是我演示我需要的最清晰的方式
抱歉,如果这是一个新手问题...在Scala我明白当你有一个返回一个实例但可能没有返回任何东西的函数时,最好使用一个Option而不是返回null.我知道这使得它在安全性方面更好,因为你没有传递空引用,并冒着某种危险NullPointerException.
但是,有没有比使用模式匹配更清晰的方法来处理选项?我最终使用的语法如下:
val optObj : Option[MyObject] = myFunctionThatReturnsOption
optObj match {
case Some(obj) => {
//my code using obj
}
case None => _
}
Run Code Online (Sandbox Code Playgroud)
实际上,这一切都等同于Java版本:
MyObject obj = myMethodThatCanReturnNull()
if (obj != null) {
//my code using obj
}
Run Code Online (Sandbox Code Playgroud)
在使用Option而不是null引用时,是否有其他方法可以避免Scala中的所有样板?我想做的就是执行一段代码,只要Option包含一些对象(即不是None).
我有许多嵌套对象,所有嵌套对象都包含在Scala Option类型中.在我的项目的其他地方,我不得不调用一个嵌入了5级深度的属性(其中一些是列表),每次调用.get.这样我最终得到的东西如下所示:
objectA.get.attrB.get.attrC.get(0).attrD.get
Run Code Online (Sandbox Code Playgroud)
除了一系列.get调用(我不确定是理想的)之外,我没有以这种方式实现很多错误处理,如果任何属性都是空的,那么整个事情就会崩溃.鉴于嵌套调用,如果我将其限制为如上所述的单行,我也只能.getOrElse在最后使用一次.
是否有任何建议的方法在Scala中使用Option类型?
我可以使用if语句执行此操作,但可能有一种"scala"方法可以执行此操作.
def notScalaConv(in: Seq[String]): Option[Seq[String]] = {
if (in.isEmpty)
None
else
Option(in)
}
Run Code Online (Sandbox Code Playgroud) 我最近尝试使用apply像工厂函数:
class X() {
def apply() : Option[X] = if (condition) Some(new X()) else None
}
val x : Option[X] = X() // <- this does not work; type is mismatched
Run Code Online (Sandbox Code Playgroud)
出于某种原因apply 总是返回X。我需要创建一个Factory方法吗?