如何将 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 中从头开始重写其中一个数据结构,然后使用一个好的分析器对其进行负载测试,我学到了很多东西。
我正在通过翻译旧的 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 中从头开始重写其中一个数据结构,然后使用一个好的分析器对其进行负载测试,我学到了很多东西。