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

时间:2018-10-22 17:23:12

标签: scala

我有一个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
    }
  }

1 个答案:

答案 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
    }
  }