Что возвращает метод split в Java и как преобразовать результат в стрим
Что проверяют
Знаете ли вы возвращаемый тип split и помните ли, что его аргумент это регулярное выражение. Вторая часть вопроса про стрим проверяет, умеете ли вы соединить старое API строк с современной обработкой данных.
Как отвечать
String.split возвращает массив строк, String[]. Дальше в стрим его переводят двумя способами: Arrays.stream(arr) или Stream.of(arr). Есть и вариант без промежуточного массива, через уже скомпилированный шаблон.
String text = "a, b,,c,";
List<String> parts = Arrays.stream(text.split(","))
.map(String::strip)
.filter(s -> !s.isEmpty())
.toList();
Stream<String> lazy = Pattern.compile(",").splitAsStream(text);Нюансы, которые отличают заученный ответ от рабочего опыта. Хвостовые пустые строки по умолчанию отбрасываются, а split(regex, -1) их сохраняет, и для разбора CSV это важно. Пустая строка на входе даёт массив из одного элемента, пустой строки, а не массив нулевой длины. Разделитель трактуется как регулярное выражение, поэтому точку, вертикальную черту, плюс и скобки нужно экранировать или оборачивать в Pattern.quote.
Где спотыкаются
Делят по точке или по вертикальной черте без экранирования. split(".") отдаёт пустой массив, потому что точка совпадает с любым символом, а split("|") разваливает строку по буквам.
Второе: считают, что для пустого входа получится пустой массив, и берут нулевой элемент без проверки. Валидация пропускает пустое значение, а дальше по коду ловится непонятная ошибка.
Третье: тянут Stream.of на любой массив. Для String[] он работает, а для массива примитивов вроде int[] даёт стрим из одного элемента, самого массива. Привычка звать Arrays.stream снимает этот класс ошибок сразу.