2014-04-11 80 views
0

我在Scala項目中遇到了下面的java代碼。如何使它更加Scala慣用且沒有副作用(適當的異常處理)?使代碼更scala慣用

我想使用scalaz分離/(我知道我也可以使用Scala,但我想也可以使用更多的偏向)。在函數中有幾個這樣的檢查(上面的例子是一個例子),它會拋出一個或另一個類型的異常。如何讓這樣的代碼更加Scala慣用?

編輯: 問題不在身邊如何將Java null檢查轉換爲斯卡拉地道,這我已經在做。例如,如下

hpi.fold(throw new Exception("Instance not found for id " + processInstanceId)) { h => 
    val pi = new ProcessInstance(taskResponse) 

現在函數的返回類型是一些值,例如「ProcessInstance」用於例如但在我看來是誤導。調用者永遠不會知道這是否會拋出異常,所以我的問題更多地是從這些函數返回[Error,Value]。如果我有一些這樣的異常被捕獲到一個函數中,如何累積它們並反映到返回類型中?

回答

1

一個想法可能會讓processDefinition.getDiagramResourceName()返回一個Option,因此您可以檢查結果是否爲Some(x)None

+0

,我已經改變了。問題更多的是積累Java中的錯誤/異常,例如代碼和返回值[Error,Value]類型的數據結構? – user2066049

1

使用scalaz並且是慣用這可能是我最終會(視情況而重構):

for { 
    pd <- Option(processDefinition.getDiagramResourceName()).\/>("Diagram resource could not be found") 
} yield pd 

所以如果你有空你回來Left("Diagram resource could not be found")否則你得到Right(DiagramResourceName)

+1

事實上,它看起來不太可讀 –

+0

我更新了更多信息的問題。任何想法? – user2066049

0

總部設在case類的一種方法,其中的名稱,引用或標籤不同的子類可以定義,

trait ResourceName 
case object MissingName extends ResourceName 
case class DiagramResourceName(name: String) extends ResourceName 
case class AnotherResourceName(ref: Int) extends ResourceName 

processDefinition.getDiagramResourceName() match { 
    case DiagramResourceName(name) => println(s"name $name") 
    case MissingName    => throw new ActivityException(errorMessage) 
} 
+0

缺少名稱可能是一個'case object' –

+0

@ om-nom-nom True,已更新的代碼。非常感謝! – elm

+0

更新的問題與更多信息。問題不在於使用Scala Option處理Java null,而是主要圍繞返回類型 – user2066049