簡體   English   中英

嘗試Unit的表達式不符合預期的類型

[英]Try expression of Unit does not conform to expected type

我有一種情況,我需要從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的調用引發異常,則resultNone 如果該調用沒有引發異常,則result將是包含sampleResult實例的Some[SampleRequest]

正如@OlegPyzhcov在評論中指出的那樣,它的一個更簡潔的版本是:

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

您可以完全消除變量,並在需要的地方返回:

object TestTry extends App {

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

    try 
      sampleRequest.fromString(fix, null, true)
      Some(sampleRequest)
    catch
      case e: InvalidMessage => None
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM