【问题标题】:Try expression of Unit does not conform to expected type单元的尝试表达式不符合预期类型
【发布时间】:2017-07-31 12:01:34
【问题描述】:

我有一个场景,我需要从 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
  }

}

【问题讨论】:

    标签: java scala


    【解决方案1】:

    一种方法是使用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 将是一个包含sampleResult 实例的Some[SampleRequest]

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

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

    【讨论】:

    • TrytoOption,所以你可以用那个替换你的map ... getOrElse
    • @OlegPyzhcov:这行不通,因为sampleRequest.fromString(...) 返回一个Unit,而我们希望最终返回类型为Option[SampleRequest]
    • 哎呀,对,错过了那一点。但是,您可以在创建时执行多个语句,例如Try { sampleRequest.fromString(...); sampleRequest }.toOption
    【解决方案2】:

    您可以完全消除变量并在需要的地方返回:

    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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多