繁体   English   中英

使代码更符合Scala习惯

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM