もちろん、@ ziggystar が示唆するように分割してからフィルタリングできることは知っていますが、非常に大きなString
要素があり、最初の要素が一致する場合、文字列が破棄されることがわかっているときに文字列の分割を終了しても意味がありません。
この場合、時間効率が心配な場合は、次のように を使用しStream
て分割操作を再実装できます。
def result(input:Option[String]):Option[Seq[String]] = {
def split(c: Char, chars:Stream[Char]):Stream[String] = {
val (head,tail) = chars span(_ != c)
head.mkString #:: (if(tail isEmpty) Stream.empty else split(c, tail tail))
}
input map {s => split(',', Stream(s:_*)) } filter (_.forall (s => !test(s)))
}
マップ/フィルター構造は同じままですが、 の使用により短絡していることに注意してくださいStream
。
それが非常に大きな文字列である場合は、おそらくStream[Char]
すでにそれを持っています。つまり、元の文字列にぶら下がっているメモリオーバーヘッドさえありません。