1. Обзор
В этом коротком руководстве мы рассмотрим преобразование массива строк или целых чисел в строку и обратно.
Мы можем добиться этого с помощью vanilla Java и служебных классов Java из часто используемых библиотек.
2. Преобразовать массив в строку
Иногда нам нужно преобразовать массив строк или целых чисел в строку, но, к сожалению, прямого метода для выполнения такого преобразования не существует.
Реализация метода toString()
по умолчанию для массива возвращает что-то вроде Ljava.lang.String;@74a10858
, что информирует нас только о типе объекта и хэш-коде.
Однако служебный класс java.util.Arrays
поддерживает работу с массивами и строками, включая метод toString() для массивов.
Arrays.toString()
возвращает строку с содержимым входного массива. Новая созданная строка представляет собой список элементов массива, разделенных запятыми, заключенных в квадратные скобки («[]»):
String[] strArray = { "one", "two", "three" };
String joinedString = Arrays.toString(strArray);
assertEquals("[one, two, three]", joinedString);
int[] intArray = { 1,2,3,4,5 };
joinedString = Arrays.toString(intArray);
assertEquals("[1, 2, 3, 4, 5]", joinedString);
И хотя это здорово, что метод Arrays.toString(int[])
так хорошо решает эту задачу, давайте сравним его с другими методами, которые мы можем реализовать самостоятельно.
2.1. StringBuilder.append()
Для начала давайте посмотрим, как сделать это преобразование с помощью StringBuilder.append()
:
String[] strArray = { "Convert", "Array", "With", "Java" };
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strArray.length; i++) {
stringBuilder.append(strArray[i]);
}
String joinedString = stringBuilder.toString();
assertEquals("ConvertArrayWithJava", joinedString);
Кроме того, для преобразования массива целых чисел мы можем использовать тот же подход, но вместо этого вызывать Integer.valueOf(intArray[i])
при добавлении к нашему StringBuilder
.
2.2. API потоков Java
Java 8 и выше предлагает метод String.join()
, который создает новую строку, объединяя элементы и разделяя их указанным разделителем, в нашем случае это просто пустая строка:
String joinedString = String.join("", new String[]{ "Convert", "With", "Java", "Streams" });
assertEquals("ConvertWithJavaStreams", joinedString);
Кроме того, мы можем использовать метод Collectors.joining()
из Java Streams API, который объединяет строки из Stream
в том же порядке, что и его исходный массив:
String joinedString = Arrays
.stream(new String[]{ "Convert", "With", "Java", "Streams" })
.collect(Collectors.joining());
assertEquals("ConvertWithJavaStreams", joinedString);
2.3. StringUtils.join()
И Apache Commons Lang никогда не должен оставаться в стороне от таких задач.
Класс StringUtils
имеет несколько методов StringUtils.join()
, которые можно использовать для преобразования массива строк в одну строку:
String joinedString = StringUtils.join(new String[]{ "Convert", "With", "Apache", "Commons" });
assertEquals("ConvertWithApacheCommons", joinedString);
2.4. Столяр.присоединиться()
И чтобы не отставать, Guava
приспосабливает то же самое к своему классу Joiner .
Класс Joiner
предлагает гибкий API и предоставляет несколько вспомогательных методов для объединения данных.
Например, мы можем добавить разделитель или пропустить нулевые значения:
String joinedString = Joiner.on("")
.skipNulls()
.join(new String[]{ "Convert", "With", "Guava", null });
assertEquals("ConvertWithGuava", joinedString);
3. Преобразование строки в массив строк
Точно так же нам иногда нужно разбить строку на массив, содержащий некоторое подмножество входной строки, разделенное указанным разделителем, давайте посмотрим, как мы можем это сделать.
3.1. Строка.split()
Во-первых, давайте начнем с разделения пробела с помощью метода String.split()
без разделителя:
String[] strArray = "loremipsum".split("");
Что производит:
["l", "o", "r", "e", "m", "i", "p", "s", "u", "m"]
3.2. StringUtils.split()
Во-вторых, давайте снова посмотрим на класс StringUtils
из библиотеки Apache Commons Lang.
Среди многих нулевых методов для строковых объектов мы можем найти StringUtils.split().
По умолчанию предполагается разделитель пробелов:
String[] splitted = StringUtils.split("lorem ipsum dolor sit amet");
Что приводит к:
["lorem", "ipsum", "dolor", "sit", "amet"]
Но мы также можем указать разделитель, если захотим.
3.3. Разделитель.split()
Наконец, мы также можем использовать Guava
с его плавным API Splitter :
List<String> resultList = Splitter.on(' ')
.trimResults()
.omitEmptyStrings()
.splitToList("lorem ipsum dolor sit amet");
String[] strArray = resultList.toArray(new String[0]);
Что генерирует:
["lorem", "ipsum", "dolor", "sit", "amet"]
4. Вывод
В этой статье мы показали, как преобразовать массив в строку и обратно, используя ядро Java и популярные служебные библиотеки.
Конечно, реализацию всех этих примеров и фрагментов кода можно найти на GitHub .