2016-04-07 25 views
4

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類中。現在這是什麼原因?

+1

使用'Any'作爲你的方法(或方法參數)的類型會帶給你一個真正的地獄(你失去了類型系統爲你提供的所有能力)。也就是說,使用'Option'實例的最習慣的方式是將其視爲一個集合或monad,並使用'map','flatMap','filter'或'foreach'。 – jarandaf

+0

http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html向下滾動到「如果值存在,則執行某些操作」... – Fildor

+2

斯卡拉已經有'fold'來做到這一點: test.fold(addError(「not found」))(builder ++ = _)' – Kolmar

回答

5

Scala中有幾種方法來實現這一目標:

  • optValue.map(successFunction).getOrElse(errorFunction)
  • optValue.fold(errorFunction)(successFunction)

可能是你想要的是第二,fold

在java中有一個.map,不知道是否有一個​​,你需要看看the docs

編輯: 至於你問到有沒有在折換行,嘗試用括號:

Some(2).fold 
    { 
    println("error") 
    } 
    { 
    value => 
     println(s"Success: $value") 
    } 
+0

謝謝你。地圖方法看起來也很有用。使用摺疊方法不能將摺疊(...)(...)寫成摺疊\ n(...)\ n(...)?從某種意義上說,在摺疊之後和每個括號之後放置一個新的行以提高可讀性。我的IDE顯示爲錯誤。 – sethu

+0

嘗試用大括號{}:'一些(2).fold { 的println( 「錯誤」) } { 值 => 的println(S 「成功:$值」) }' – pedrorijo91

+0

評論失去換行符,編輯答案 – pedrorijo91

1

我想你錯過的是原因爲什麼你需要選項。

後面的選項(選配和Java中)的想法是,你(開發者)現在可以指出的值可能會或可能不存在,在類型級別。

花點時間考慮一下。你將如何做到這一點與一個變量,可能只是空?

...

這是一個問題,對吧?

  • 如果將永遠是空當你閱讀的價值,你不知道
  • 你必須總是檢查它是否是空這樣的變量,如果你希望你的代碼是安全的。

但是,現在隨着選項/選配,你和誰與你的代碼工作的一些其他開發商現在由編譯器他們必須檢查的可能性,這個變量將是無效告知(或不!)。

如果我們現在進一步考慮一下,想象一下如果您以一種可能爲空的變量爲Option的方式編寫所有代碼。任何永遠不會爲空的變量(將始終有一個值),不是!你明白我的觀點吧?

如果你這樣編寫所有的代碼,你最終將不會意外地依賴不存在的值的存在,也不會不必要地檢查值是否在那裏,當它永遠是! ; )

+1

你錯過了OP的觀點。我認爲他明白這一點。但是當期權是無時,他想做一些事情,這並非不合理。 Map等允許你在Option選項有些時候做某些事情(並且當它沒有做任何事情時什麼都不做),但是如果你確實有一些特定的事情要做時(例如,顯示一條錯誤消息),那麼它的支持不是很好。 –

+0

我的回答是基於他的:*「我一定是做錯了什麼,很可能,我對如何使用選項的理解是有缺陷的。」*評論 – gsaslis

+0

仍然沒有回答他的實際問題,這是關於處理None案件(請參閱主題和最後的問題) –