为了清晰起见,从scala模式中提取文本

为了清晰起见,从scala模式中提取文本,scala,Scala,我有一个Conent信封,其中的消息是一个字符串,它可能是base64编码的,如果可能的话,也可能是gzip编码的。下面的message方法处理消息被编码和压缩的情况。然而,为了清晰起见,以某种方式提取模式会很好,scala是否提供了这样做的工具 case class Content(Message: String, MessageAttributes: Option[MessageAttributes]) case class Message

我有一个Conent信封,其中的消息是一个字符串,它可能是base64编码的,如果可能的话,也可能是gzip编码的。下面的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)
我想做什么(当然,模式中的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
    }
  }