我有一种情况,我需要从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