使代码更加scala惯用

时间:2014-04-11 02:22:24

标签: scala

我在Scala项目中遇到了类似java的代码。如何使更多Scala惯用没有副作用(适当的异常处理)?

我正在考虑使用scalaz disjunction /(我知道我也可以使用Scala,但我更喜欢正确的偏见)。在函数中有一些这样的if检查(上面是一个例子),它抛出一种或另一种类型的异常。如何使这样的代码更加Scala惯用?

修改 问题不在于如何将Java空值检查转换为Scala Idiomatic,我已经在做了。例如以下

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

现在返回现有函数的类型是一些值,例如“ProcessInstance”,例如但在我看来是误导。调用者永远不会知道这是否会抛出异常所以我的问题更多的是从这些函数返回[Error,Value]。如果我将一些此类异常捕获到单个函数中,如何将它们全部累积并反映到返回类型中?

3 个答案:

答案 0 :(得分:1)

有人认为processDefinition.getDiagramResourceName()可能会返回Option,因此您可以检查结果是Some(x)还是None

答案 1 :(得分:1)

使用scalaz并且是惯用语,这可能是我最终会得到的结果(需要重构):

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

因此,如果您为空,则会返回Left("Diagram resource could not be found"),否则您将获得Right(DiagramResourceName)

答案 2 :(得分:0)

基于案例类的方法,其中可以定义名称,引用或标签的不同子类,

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)
}