如何将Scala中的if语句转换为case匹配语句块

时间:2015-04-26 22:10:44

标签: scala pattern-matching

我正在学习如何通过翻译旧的Java代码来编写Scala代码。以下代码是此学习过程中的尝试:

我创建了一个类,如下所示。现在,此代码中的if语句是否可以由大小写匹配块替换?我特别希望通过一个处理异常情况的默认情况进行案例匹配。我怎么能做到这一点?

class MyTest {
//ResEmail is a case class
//MultipartEnityBuilder is from the httpmime-4.4.jar

    def makeResponse(resEmail: ResEmail): HttpEntity = {
            val maker = MultipartEntityBuilder.create()
            maker.addTextBody("api_user", this.apikey)
            maker.addTextBody("api_key", this.apivalue)
            val tos = resEmail.toList
            val tonames = resEmail.toNameList
            val ccs = resEmail.ccS

            if (tos.length == 0) {
              builder.addTextBody(stringToFormattedString(ARG_TO), respEmail.fromEmail, ContentType.create("text/plain", "UTF-8"))
            }

            else if(tos.length > 0) {
              for (i <- 0 until tos.length) 
                maker.addTextBody(PARAM_TO.format(PARAM_TO, i), tos(i), ContentType.create("text/plain", "UTF-8"))
            }

            if (resEmail.fromEmail != null && !resEmail.fromEmail.isEmpty) maker.addTextBody(PARAM_FROM, resEmail.fromEmail, 
              ContentType.create("text/plain", "UTF-8"))

            if (resEmail.fromName != null && !resEmail.fromName.isEmpty) maker.addTextBody(PARAM_FROMNAME, 
              respEmail.fromName, ContentType.create("text/plain", "UTF-8"))

            if (respEmail.replyToEmail != null && !resEmail.replyToEmail.isEmpty) maker.addTextBody(PARAM_REPLYTO, 
              respEmail.replyToEmail, ContentType.create("text/plain", "UTF-8"))

            if (resEmail.subject != null && !resEmail.subject.isEmpty) maker.addTextBody(PARAM_SUBJECT, 
              resEmail.subject, ContentType.create("text/plain", "UTF-8"))

            val tmpString = new MyExpApi().jsonString()
            if (tmpString != "{}") maker.addTextBody(PARAM_MYSMTPAPI, tmpString, ContentType.create("text/plain", 
              "UTF-8"))
            maker.build()
          }


   }// end of class MyTest

1 个答案:

答案 0 :(得分:2)

  

我特意想要通过一场摔倒进行案例匹配   处理异常情况的默认情况。我怎样才能完成   此?

您在寻找case _吗?

resEmail.fromEmail match {
  case null =>
  case badEmail if badEmail.isEmpty =>
  case goodEmail =>
    maker.addTextBody(PARAM_FROM, resEmail.fromEmail, 
              ContentType.create("text/plain", "UTF-8"))
    maker.addTextBody(PARAM_FROM, resEmail.fromEmail, 
              ContentType.create("text/plain", "UTF-8"))
  case _ => throw new Exception("Case not handled.")
}

允许addTextBody之类的Mutator方法,但在Scala中被认为是“老派”。

这样的事情会将验证和构造案例分开:

val textBody: Option[String] = resEmail.fromEmail match {
  case null => None
  case badEmail if badEmail.isEmpty => None
  case goodEmail => Some(createContentForTextBody(goodEmail))
  case _ => throw new Exception("Case not handled.")
}

...当然,您可以通过在Try中返回异常/结果来进一步处理函数样式,以避免抛出所产生的副作用(尽管在我的示例中它应该无法访问,因为{{ 1}}应该匹配给它的任何情况。)

Scala允许您比Java更优雅地管理无效案例,但我认为管理这些案例的最佳方法是不允许它们发生。

  

我正在学习如何通过翻译在Scala中进行编码   来自较旧的Java代码。

祝你好运。我使用IntelliJ将现有的Java代码库转换为Scala。它在从.java文件中创建有效的.scala文件方面做得非常好,但结果代码并不好,惯用的Scala。通过在Scala中从头开始重写其中一个数据结构,然后使用一个好的分析器对其进行负载测试,我学到了很多东西。