set*_*thu 6 java scala optional
scala和java中的选项是我难以理解和使用的东西.我理解它的存在是为了消除'null'处理地狱.坦率地说,我认为它引入了另一种地狱!
我在java中处理null的方法是做类似的事情:
String test = null;
if(test==null) // do something
else // do something else
Run Code Online (Sandbox Code Playgroud)
当我切换到选项时,我正在寻求做出这种决定.
但是scala和java中的Option类中没有方法可以说,如果null执行某些操作,则执行其他操作.
如果subject为null,有一种方法可以默认值,例如
//in scala
test.getOrElse("defaulted")
Run Code Online (Sandbox Code Playgroud)
我想知道为什么不能使用像我写的"pimp up"Scala选项的隐式类这样的方法
object Definitions{
implicit class OptionExtensions[$Data](option: Option[$Data]){
def perform (found: ($Data)=>Any, notFound: ()=>Any): Any={
option match{
case Some(data)=> found(data)
case None=> notFound()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请忽略名称错误的方法.但是现在写了这个,我可以使用这样的选项:
import Definitions._
val test : Option[String] = None
var builder =new StringBuilder
test.perform(builder ++= _, ()=>addError("not found"))
//or
println(test.perform(_.reverse, ()=>{"something else"}))
def addError(error:String)={
println(error)
}
Run Code Online (Sandbox Code Playgroud)
相反,我被迫编写匹配和案例来处理与Options有关的任何事情.我一定做错了什么.最有可能的是,我对如何使用选项的理解是有缺陷的.由于某种原因,上面的处理方式默认不在Option类中.那可能是什么原因?
ped*_*o91 10
在scala中有几种方法可以实现:
optValue.map(successFunction).getOrElse(errorFunction)optValue.fold(errorFunction)(successFunction)可能你想要的是第二个,fold.
在java中有一个.map,不确定是否有.fold,你需要查看文档
编辑:当您要求折叠换行时,请尝试使用括号:
Some(2).fold
{
println("error")
}
{
value =>
println(s"Success: $value")
}
Run Code Online (Sandbox Code Playgroud)