假设我需要一个函数来从字符串chars
中过滤掉str
的字符,然后从结果中只获取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)
现在假设我需要清理并修剪两个字符串。我想fold
他们懒洋洋地同时处理他们两个人中的一个角色并返回两个结果。
def cleanTrim2(str1: String,
str2: String,
chars: Set[Char],
k: Int): (String, String) = ???
你会如何建议实施它?
答案 0 :(得分:3)
我没有看到使用懒惰的任何好处。在您的第二个cleanTrim
实现中,您仍然扫描整个字符串,实际上您无法检查字符串contains
是否不扫描整个字符串(或流或视图)。
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)
}