【问题标题】:Iterating Akka ByteString in reverse反向迭代 Akka ByteString
【发布时间】:2016-01-21 22:51:37
【问题描述】:

我以ByteString 从 TCP 服务器接收数据。消息以最后一个字节为 0x03 结束。对于我收到的每个ByteString,我需要检查最后一个字节是否为 0x03。现在我打电话给lastIndexof。

val data : ByteString = ...

if (data.lastIndexOf(0x03) >= 0) {}

但这是低效的,因为对于大多数消息块,它会无缘无故地遍历所有字节。有没有办法反向遍历字节?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    ByteString 是 IndexedSeq,因此在恒定或接近恒定的时间内,您应该能够执行以下操作:

    val terminated = data.lastOption.filter(_ == 0x03).getOrElse(false)
    

    在底层,这将使用apply 方法来获取长度 - 1 元素。根据IndexedSeq 文档,length 和apply 都应该在恒定或接近恒定的时间内执行。

    Indexed sequences support constant-time or near constant-time element access and length computation
    

    【讨论】:

      【解决方案2】:

      因为ByteString 是Seq 你可以这样做

      if (data.last == 0x03) {}
      

      但我不知道它是如何实现的,所以我不能保证它不会遍历整个事情。

      【讨论】:

      • 谢谢,这将工作。但是 cmbaxter 的答案更通用,并且会在其他问题领域为我提供更好的服务。所以我接受那个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多