scala和java中的選項是我努力去理解和使用的東西。我理解它在那裏是爲了消除'空'處理地獄。坦率地說,我認爲它引入了另一種地獄!斯卡拉和Java選項如果不存在,如果不做其他構造
我在Java中處理空值的方法是做這樣的事情:
String test = null;
if(test==null) // do something
else // do something else
這類決定是什麼,我求當我切換到選項做。
但是在Scala和Java的Option類中沒有任何方法可以說,如果null做某件事,否則做別的事情。
有一種方法爲默認的主題被空的情況下的值,如
//in scala
test.getOrElse("defaulted")
我想知道爲什麼不能是方法,比如我已經寫信給「皮條客了」隱式類斯卡拉選項
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()
}
}
}
}
請忽略嚴重命名的方法。但有了這個,現在寫的,我可以推測使用的選項是這樣的:
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)
}
相反,我被迫寫的匹配和案件處理任何與選項。我一定做錯了什麼。很可能,我對如何使用選項的理解是有缺陷的。由於某種原因,上述處理方式默認不在Option類中。現在這是什麼原因?
使用'Any'作爲你的方法(或方法參數)的類型會帶給你一個真正的地獄(你失去了類型系統爲你提供的所有能力)。也就是說,使用'Option'實例的最習慣的方式是將其視爲一個集合或monad,並使用'map','flatMap','filter'或'foreach'。 – jarandaf
http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html向下滾動到「如果值存在,則執行某些操作」... – Fildor
斯卡拉已經有'fold'來做到這一點: test.fold(addError(「not found」))(builder ++ = _)' – Kolmar