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