我從TCP服務器接收數據爲ByteString
。消息以最後一個字節爲0x03結束。對於我收到的每個ByteString
我需要檢查最後一個字節是否爲0x03。現在我打電話給lastIndexof
。反向重複Akka字節串
val data : ByteString = ...
if (data.lastIndexOf(0x03) >= 0) {}
但是這是低效率的,因爲對於大多數消息塊它將遍歷所有字節,沒有很好的理由。有什麼方法可以通過反向字節來遍歷嗎?
我從TCP服務器接收數據爲ByteString
。消息以最後一個字節爲0x03結束。對於我收到的每個ByteString
我需要檢查最後一個字節是否爲0x03。現在我打電話給lastIndexof
。反向重複Akka字節串
val data : ByteString = ...
if (data.lastIndexOf(0x03) >= 0) {}
但是這是低效率的,因爲對於大多數消息塊它將遍歷所有字節,沒有很好的理由。有什麼方法可以通過反向字節來遍歷嗎?
一個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
由於ByteString
是Seq
你可以做
if (data.last == 0x03) {}
,但我不它是如何實現的,所以我不能保證它不遍歷整個事情反正。
謝謝,這將工作。然而,cmbaxter的答案更爲通用,在其他問題領域會更好地爲我服務。所以我接受那一個。 – RajV