Scala-遍历ByteString直到为空

Scala-遍历ByteString直到为空,scala,akka,Scala,Akka,有没有比我这里介绍的更简洁和/或更高效的方法来遍历消息 import akka.util.ByteString @throws[GarbledMessageException] def nextValue(message: ByteString) = message.indexOf(delimiter) match { case i if i >= 0 => message.splitAt(i)

有没有比我这里介绍的更简洁和/或更高效的方法来遍历
消息

    import akka.util.ByteString

    @throws[GarbledMessageException]
    def nextValue(message: ByteString) =

        message.indexOf(delimiter) match {

           case i if i >= 0 => message.splitAt(i)

           case _ => throw new GarbledMessageException("Delimiter Not Found")
       }


   @tailrec
   def processFields(message: ByteString): Unit = nextValue(message) match {

      case (_, ByteString.empty) => // Complete Parsing

      case (value, rest) =>
        // Do work with value

        // loop
        processFields(rest)
   }
为每个影响性能的拆分创建一个新的ByteString,但至少不会复制底层缓冲区,只计算引用


也许它甚至可以比这更好?

这可能具体取决于您正在做的工作类型,但是如果您正在寻找比拆分ByteString更有效的方法,请看一看,您可以通过调用ByteString上的
迭代器来获得


ByteIterator允许您直接转到基元值(int、float等),而不必首先拆分新的ByTestRing。

我建议在processFields上放置@tailrec,让编译器强制执行尾部递归。这将防止无意中破坏堆栈。谢谢,我忘了包括它。不幸的是,我的消息数据是ASCII编码的,所以除非我自己进行转换,否则我不能直接使用原语。(从Java标准库复制)。我不知道你的
nextValue
函数是如何解析ByteString的,但也许它可以直接指向你的“工作”使用的任何类型的对象,例如字符串,而不是先拆分ByteString。例如,ByteString->Array[Byte]->String。您的工作需要什么样的数据?与此同时,如果您发布了
nextValue
函数的详细信息,可能会更容易给出建议,因为这是您通过testrings进行分离的地方。我添加了
nextValue
实现。从那里,我将
通过testring
转换为
Int
Double
字符串。现在,我采取了简单的方法,并在两者之间使用
String
转换步骤使其工作。我对删除该步骤非常感兴趣,也许我可以使用
隐式
来帮助。。。(编译器优化)一旦找到分隔符,您可能可以跳过新的ByteString步骤,但实际上我认为这样做没有多大价值,我认为这已经是相当优化的性能。我还使用
编写了一个非递归版本,但不幸的是,它最终并没有变得更简洁,或者只是一个替代方案。如果你感兴趣,我可以把它贴出来。