[英]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.