代码之家  ›  专栏  ›  技术社区  ›  SourceSimian

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

  •  1
  • SourceSimian  · 技术社区  · 6 年前

    我有一个conent信封,其中的消息是一个字符串,可能是base64编码的,如果可能的话,还可以gzip。下面的消息方法处理对消息进行编码和压缩的情况。然而,为了清楚起见,以某种方式提取模式是很好的,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 = {
        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 回复  |  直到 6 年前
        1
  •  1
  •   Vitalii Honta    6 年前

    假设你已经在某个地方定义了你的模式:

    // 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
        }
      }