我有一个Conent信封,其中的Message是一个字符串,可能是base64编码的,如果可能的话,也将其压缩。下面的message方法处理Message既被编码又被压缩的情况。但是,为了清楚起见,以某种方式提取模式会很好,scala是否提供了这样做的便利?
case class Content(Message: String,
MessageAttributes: Option[MessageAttributes])
case class MessageAttributes(compression: Option[MessageAttribute],
encoding: Option[MessageAttribute])
case class MessageAttribute(Type: String, Value: String)
我想做的事情(但是模式中使用Base64EncodingAndCompression当然会遮盖我的val):
def message: String = {
val withBase64EncodingAndCompression =
Some(MessageAttributes(Some(MessageAttribute("String", "gzip")), Some(MessageAttribute("String", "base64"))))
parsed.extract[Content] match {
case Content(message, withBase64EncodingAndCompression) =>
val decoded = Base64.getDecoder.decode(message)
GZIPCompression.decompress(decoded)
case _ => message
}
}
我该做什么:
def message: String = {
parsed.extract[Content] match {
case Content(message, Some(MessageAttributes(Some(MessageAttribute("String", "gzip")), Some(MessageAttribute("String", "base64"))))) =>
val decoded = Base64.getDecoder.decode(message)
GZIPCompression.decompress(decoded)
case _ => message
}
我从下面改编了Vitalii Honta的回答。名称是不同的,并且我删除了无限递归,但这表明了我的追求—将尽可能多的模式移到case子句之外。
def sqsEnvelopeMessage: String = {
val sqsEnvelope = SqsEnvelope(parsed)
val withBase64EncodingAndCompression = Some(SqsEnvelopeAttributes(Some(SqsEnvelopeAttribute("String", "base64")), Some(SqsEnvelopeAttribute("String", "gzip"))))
sqsEnvelope match {
case SqsEnvelope(message, `withBase64EncodingAndCompression`) =>
val decoded = Base64.getDecoder.decode(message)
GZIPCompressionUtil.decompress(decoded)
case SqsEnvelope(message, _) =>
message
}
}
答案 0 :(得分:1)
假设您已在某处定义了模式:
// no need to wrap MessageAttributes into Some here
val withBase64EncodingAndCompression =
MessageAttributes(Some(MessageAttribute("String", "gzip")), Some(MessageAttribute("String", "base64")))
如果我理解正确,则可以使用Scala提供的特殊语法重写代码:
def message: String = {
parsed.extract[Content] match {
case Content(message, Some(`withBase64EncodingAndCompression`)) =>
// your code handling message
case _ => message
}
}
在match
中使用反引号(``)等效于使用==
运算符进行比较:
def message: String = {
parsed.extract[Content] match {
case Content(message, Some(x)) if x == withBase64EncodingAndCompression =>
// your code handling message
case _ => message
}
}