2014-04-11 46 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