[英]Making code more scala idiomatic
我在Scala項目中遇到了以下類似Java的代碼。 如何使它更符合Scala習慣用法而沒有副作用(適當地處理異常)?
我正在考慮使用scalaz析取/(我知道我也可以使用Scala,但我猜想像右偏)。 在一個函數中,有一些這樣的if校驗(上面的一個示例)拋出了一種或另一種異常。 如何使這樣的代碼更符合Scala習慣?
編輯:問題不在於如何將Java空檢查轉換為我已經在做的Scala Idiomatic。 例如
hpi.fold(throw new Exception("Instance not found for id " + processInstanceId)) { h =>
val pi = new ProcessInstance(taskResponse)
現在,現有函數的返回類型是某個值,例如“ ProcessInstance”,但在我看來是令人誤解的。 調用者永遠不會知道這是否會引發異常,因此我的問題更多是關於從此類函數返回Either [Error,Value]。 如果我將少數此類異常捕獲到單個函數中,那么如何將它們全部累加並反映為返回類型?
有一種想法可能會使processDefinition.getDiagramResourceName()
返回一個Option
,因此您可以檢查結果是Some(x)
還是None
。
使用scalaz並習慣用法,這可能是我最終會遇到的問題(需要重構):
for {
pd <- Option(processDefinition.getDiagramResourceName()).\/>("Diagram resource could not be found")
} yield pd
因此,如果您為null,則返回Left("Diagram resource could not be found")
否則返回Right(DiagramResourceName)
。
一種基於案例類的方法,其中可以定義名稱,引用或標簽的不同子類,
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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.