Есть ли комбинация takeWhile, dropWhile в Scala?

В Scala я хочу разбить строку на конкретный символ следующим образом:

scala> val s = "abba.aadd" 
s: String = abba.aadd
scala> val (beforeDot,afterDot) = (s takeWhile (_!='.'), s dropWhile (_!='.'))
beforeDot: String = abba
afterDot: String = .aadd

Это решение немного неэффективно (возможно, не асимптотически), но я чувствую, что в стандартной библиотеке уже есть что-то вроде этого. Любые идеи?

Ответы

Ответ 1

Существует метод span:

scala> val (beforeDot, afterDot) = s.span{ _ != '.' }
beforeDot: String = abba
afterDot: String = .aadd

Из Scala документация:

c span p эквивалентен (но, возможно, более эффективен, чем) (c takeWhile p, c dropWhile p), если оценка предиката p не вызывает никаких побочных эффектов.

Ответ 2

Вы можете использовать splitAt для того, что вы хотите:

val s = "abba.aadd"
val (before, after) = s.splitAt(s.indexOf('.'))

Вывод:

before: String = abba
after: String = .aadd