Scala 惰性地将包含单词的字符串转换为单词流

Scala 惰性地将包含单词的字符串转换为单词流,scala,Scala,给定一个包含单词和空格(如“aaa-bbb-ccc-ddd”)的字符串,您是否可以将其惰性地转换为一个流,该流将字符串按空格(如stream(“aaa”),进行拆分?首先需要创建迭代器吗?这可能是一个javish解决方案,但可能适合您的需要。您可以利用java.util.Scanner也是迭代器这一事实(尽管它是java迭代器) 上述代码几乎可以写成一行: import scala.collection.JavaConverters._ import java.util.Scanner val

给定一个包含单词和空格(如“aaa-bbb-ccc-ddd”)的字符串,您是否可以将其惰性地转换为一个流,该流将字符串按空格(如stream(“aaa”),进行拆分?首先需要创建迭代器吗?

这可能是一个javish解决方案,但可能适合您的需要。您可以利用java.util.Scanner也是迭代器这一事实(尽管它是java迭代器)

上述代码几乎可以写成一行:

import scala.collection.JavaConverters._
import java.util.Scanner

val stream = new Scanner(str).useDelimiter(" ").asScala.toStream

在查看scaladocs之后,这里有一个解决方案应该可以工作。为了模拟string的
split(regex:string,limit:Int)
函数,需要单独处理边缘情况,例如1和0

  def wordStream(s: String): Stream[String] = {
    def loop(offset: Int): Stream[String] = {
      val substring = s.substring(offset)
      val preWhitespace = substring.takeWhile(_.isWhitespace).size
      val word = s.substring(preWhitespace).takeWhile(c => !c.isWhitespace)

      word #:: {
        val newOffset = offset + preWhitespace + word.length
        if (newOffset >= raw.length) Stream.empty
        else loop(newOffset)
      }
    }
    loop(0)
  }

“这将触发从java迭代器到Scala one的转换”真的吗<代码>Java转换器。使用了,因此需要调用
asScala
来执行转换(就像在上一个示例中一样)。@VladimirMatveev当然,我在范围内有Java转换,所以我把它们弄糊涂了
  def wordStream(s: String): Stream[String] = {
    def loop(offset: Int): Stream[String] = {
      val substring = s.substring(offset)
      val preWhitespace = substring.takeWhile(_.isWhitespace).size
      val word = s.substring(preWhitespace).takeWhile(c => !c.isWhitespace)

      word #:: {
        val newOffset = offset + preWhitespace + word.length
        if (newOffset >= raw.length) Stream.empty
        else loop(newOffset)
      }
    }
    loop(0)
  }