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

How to convert if statements in Scala to a case match statement block

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

我创建了一个 class,如下所示。现在,这段代码中的 if 语句可以替换为 case match 块吗?我特别希望通过处理异常情况的默认案例来进行案例匹配。我怎样才能做到这一点?

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

I am specifically looking to do a case match with a fall through default case that handles an exceptional case. How can I accomplish this?

你在找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 等增变器方法是允许的,但在 Scala 中被认为是 "old-school"。

像这样的东西会把验证和构造用例分开:

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 中返回 exception/result 来进一步使用函数式样式,以避免 throw 产生的副作用(尽管在我的例如,因为 case goodEmail 应该匹配给定的任何大小写)。

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

I am in the process of learning how to code in Scala by translating from older Java code.

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