惯用Scala迭代所有子串

pat*_*rit 5 functional-programming scala idioms idiomatic

比这更不必要的东西:

def subs(s: String) = for {start <- 0 to s.length; end <- i to s.length} yield s.substring(start, end)

Rog*_*ach 11

scala> "asdf".inits.flatMap(_.tails).toList
res2: List[String] = List(asdf, sdf, df, f, "", asd, sd, d, "", as, s, "", a, "", "")
Run Code Online (Sandbox Code Playgroud)

如果要删除空字符串:

scala> "asdf".inits.flatMap(_.tails.toList.init).toList
res3: List[String] = List(asdf, sdf, df, f, asd, sd, d, as, s, a)
Run Code Online (Sandbox Code Playgroud)

但请注意,正如@Randall Schulz在评论中指出的那样,这种咒语对读者来说并不那么明显.另一方面,您的原始版本立即清晰.

  • 您可以使用 `"asdf".inits.flatMap(_.tails).toList` 而不是 `flatten` (2认同)