Это split
поведение унаследовано от Java, к лучшему или к худшему ...
Scala не переопределяет определение из примитива String
.
Обратите внимание, что вы можете использовать аргумент limit
для изменения поведения :
Параметр limit определяет количество применений шаблона и, следовательно, влияет на длину результирующего массива. Если предел n больше нуля, то шаблон будет применен не более n - 1 раз, длина массива будет не больше n, а последняя запись массива будет содержать все входные данные за пределами последнего сопоставленного разделителя. Если n не является положительным, то шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину. Если n равно нулю, шаблон будет применяться столько раз, сколько возможно, массив может иметь любую длину, а завершающие пустые строки будут отбрасываться.
т.е. Вы можете установить limit=-1
, чтобы получить поведение (всех?) других языков:
@ ",a,,b,,".split(",")
res1: Array[String] = Array("", "a", "", "b")
@ ",a,,b,,".split(",", -1) // limit=-1
res2: Array[String] = Array("", "a", "", "b", "", "")
Кажется, хорошо известно, что поведение Java весьма запутанно , но:
Поведение выше можно наблюдать как минимум с Java 5 до Java 8.
Была попытка изменить поведение для возврата пустого массива при разбиении пустой строки в JDK-6559590 . Однако вскоре он был возвращен в JDK-8028321 , когда он вызывает регрессию в различных местах. Это изменение никогда не войдет в первоначальный выпуск Java 8.
Примечание: Метод split не был в Java с самого начала (он не в 1.0.2 ), но на самом деле он существует как минимум с 1.4 (например, см. JSR51 * 1040). * около 2002 г.) Я все еще расследую ...
Что непонятно, так это то, почему Java выбрала это в первую очередь (я подозреваю, что это изначально было оплошностью / ошибкой в «крайнем случае»), но теперь безвозвратно запекается в язык и поэтому остается .