如何一次懒惰地处理两个字符串?

How to process lazily two strings at once?

假设我需要一个函数来从字符串 str 中过滤掉 chars 的字符,然后只从结果中取出 k 个字符:

def cleanTrim(str: String, chars: Set[Char], k: Int): String =
  str.filterNot(chars).take(k)

这个实现不是最理想的,因为它不必要地扫描整个字符串。为了优化它,我们可以使用 view 或事件 Stream 来延迟扫描输入,例如:

def cleanTrim(str: String, chars: Set[Char], k: Int): String =
  str.view.foldLeft("") { case (r, c) => if (chars.contains(c)) r + c else r }.take(k)

假设现在我需要清理 trim 懒惰 两个 字符串。我想 fold 他们懒惰地同时处理来自他们两个的单个字符并且 return 两个结果。

def cleanTrim2(str1: String,
               str2: String,
               chars: Set[Char],
               k: Int): (String, String) = ???

您建议如何实施?

我看不到使用懒惰有任何好处。在 cleanTrim 的第二个实现中,您仍然扫描整个字符串,实际上,如果不扫描整个字符串(或流或视图)就无法检查字符串 contains 是否为字符。

UPD:@thwiegan 对,我没有仔细阅读问题。

UPD2:好的,我的第二次尝试,不知道你使用fold是否重要,但我看到了更清楚的方法:

def cleanTrim2(str1: String, str2: String, chars: Set[Char], k: Int): (String, String) = {
        val result1 = str1.iterator.filterNot(chars).take(k).mkString
        val result2 = str2.iterator.filterNot(chars).take(k).mkString
        (result1, result2)
    }