我有一种情况,我需要从Scala代码中调用Java API,该代码返回void并引发异常,以防万一,如果参数无效。我目前正在按以下方式进行处理,但是我想知道是否有一种方法可以避免var以及是否有一种惯用的方法在Scala中实现:

object TestTry extends App {

  def createSampleRequest(message: String): Option[SampleRequest] = {
    val sampleRequest = new SampleRequest()

    //I really want to avoid var
    var parsedSampleRequest = Option(SampleRequest)

    //Calling a Java method returns void
    try sampleRequest.fromString(fix, null, true)
    catch {
      case e: InvalidMessage => parsedSampleRequest = Option.empty
    }

    parsedSampleRequest
  }

}

最佳答案

一种方法是使用Try

import scala.util.Try

def createSampleRequest(message: String): Option[SampleRequest] = {
  val sampleRequest = new SampleRequest()
  Try(sampleRequest.fromString(fix, null, true))
    .map(s => Option(sampleRequest))
    .getOrElse(None)
}


如果对fromString的调用引发异常,则result将为None;如果调用没有引发异常,则result将是包含Some[SampleRequest]实例的sampleResult

正如@OlegPyzhcov在评论中指出的那样,它的一个更简洁的版本是:

Try { sampleRequest.fromString(fix, null, true); sampleRequest } .toOption

10-06 06:42