为了清晰起见,从scala模式中提取文本
我有一个Conent信封,其中的消息是一个字符串,它可能是base64编码的,如果可能的话,也可能是gzip编码的。下面的message方法处理消息被编码和压缩的情况。然而,为了清晰起见,以某种方式提取模式会很好,scala是否提供了这样做的工具为了清晰起见,从scala模式中提取文本,scala,Scala,我有一个Conent信封,其中的消息是一个字符串,它可能是base64编码的,如果可能的话,也可能是gzip编码的。下面的message方法处理消息被编码和压缩的情况。然而,为了清晰起见,以某种方式提取模式会很好,scala是否提供了这样做的工具 case class Content(Message: String, MessageAttributes: Option[MessageAttributes]) case class Message
case class Content(Message: String,
MessageAttributes: Option[MessageAttributes])
case class MessageAttributes(compression: Option[MessageAttribute],
encoding: Option[MessageAttribute])
case class MessageAttribute(Type: String, Value: String)
我想做什么(当然,模式中的Base64编码和压缩只会影响我的val):
我要做的是:
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
}
}
假设您已经在某个地方定义了您的模式:
// 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
}
}
是的,那正是我想要的——谢谢。我知道反勾号只是将任意字符串用作变量名的一种方式,而不是用于模式替换。我在我的帖子中修改了你的答案,主要是为了删除我的无限递归,但也为了通过删除Some()使case子句更短
def message: String = {
parsed.extract[Content] match {
case Content(message, Some(x)) if x == withBase64EncodingAndCompression =>
// your code handling message
case _ => message
}
}