Присоединиться к массиву примитивов с разделителем в Java
1. Вступление
В этом кратком руководстве мы узнаем, какjoin an array of primitives with a single-character separator in Java. В наших примерах мы рассмотрим два массива: массивint и массивchar.
2. Определение проблемы
Начнем с определения массиваint и массиваchar для примеров, а также символа разделителя, который мы будем использовать для объединения их содержимого:
int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9};
char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
char separatorChar = '-';
String separator = String.valueOf(separatorChar);
Обратите внимание, что мы включили разделителиchar иString, так какsome of the methods we’ll show require a char argument, while others require a String argument.
Результаты операции соединения будут содержать“1-2-3-4-5-6-7-8-9” для массиваint и“a-b-c-d-e-f” для массиваchar.
3. Collectors.joining()с
Начнем с одного из доступных методов Java 8 Stream API -Collectors.joining().
Сначала мы создаемStream из массива примитивов, используя методArrays.stream() из пакетаjava.util. Затем мы сопоставляем каждый элемент сString. И наконец, мы объединяем элементы с нашим заданным разделителем.
Начнем с нашего массиваint:
String joined = Arrays.stream(intArray)
.mapToObj(String::valueOf)
.collect(Collectors.joining(separator));
When joining our char array with this method, we must first wrap the char array into CharBuffer and then project it to char again. Это связано с тем, что методchars() возвращаетStream значенийint.
К сожалению, Java Stream API не предоставляет собственный метод для упаковкиStream изchar.
Присоединяемся к нашему массивуchar:
String joined = CharBuffer.wrap(charArray).chars()
.mapToObj(intValue -> String.valueOf((char) intValue))
.collect(Collectors.joining(separator));
4. StringJoinerс
ПодобноCollectors.joining(), этот подход использует Stream API, но вместо сбора элементов он выполняет итерацию по элементам и добавляет их в экземплярStringJoiner:
StringJoiner intStringJoiner = new StringJoiner(separator);
Arrays.stream(intArray)
.mapToObj(String::valueOf)
.forEach(intStringJoiner::add);
String joined = intStringJoiner.toString();
Again, we have to wrap our char array into CharBuffer при использовании Stream API:
StringJoiner charStringJoiner = new StringJoiner(separator);
CharBuffer.wrap(charArray).chars()
.mapToObj(intChar -> String.valueOf((char) intChar))
.forEach(charStringJoiner::add);
String joined = charStringJoiner.toString();
5. Apache Commons Lang
БиблиотекаApache Commons Lang предоставляет несколько удобных методов в классахStringUtils иArrayUtils, которые мы можем использовать для объединения наших примитивных массивов.
Чтобы использовать эту библиотеку, нам нужно добавитьcommons-lang3dependency к нашемуpom.xml:
org.apache.commons
commons-lang3
3.8.1
При работе с разделителемString мы будем использовать какStringUtils, так иArrayUtils.
Давайте используем их вместе, чтобы присоединиться к нашему массивуint:
String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);
Или, если мы используем примитивный типchar в качестве разделителя, мы можем просто написать:
String joined = StringUtils.join(intArray, separatorChar);
Реализации для присоединения к нашему массивуchar очень похожи:
String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);
А при использовании разделителяchar:
String joined = StringUtils.join(charArray, separatorChar);
6. гуайява
БиблиотекаGoogle’s Guava предоставляет классJoiner, который мы можем использовать для объединения наших массивов. Чтобы использовать Guava в нашем проекте, нам нужно добавитьthe guava Maven dependency:
com.google.guava
guava
27.0.1-jre
Давайте присоединимся к нашему массивуint, используя классJoiner:
String joined = Joiner.on(separator).join(Ints.asList(intArray));
В этом примере мы также использовали методInts.asList() от Guava, который красиво преобразует массив примитивов вList изInteger.
Guava предлагает аналогичный метод преобразования массиваchar вList изCharacter.. В результате присоединение к нашему массивуchar очень похоже на приведенный выше пример, в котором использовалсяint массив:
String joined = Joiner.on(separator).join(Chars.asList(charArray));
7. StringBuilderс
Наконец,if we can’t use either Java 8 or third-party libraries, we can manually join an array of elements with StringBuilder. В этом случае реализация идентична для обоих типов массивов:
if (array.length == 0) {
return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
stringBuilder.append(array[i]);
stringBuilder.append(separator);
}
stringBuilder.append(array[array.length - 1]);
String joined = stringBuilder.toString();
8. Заключение
Эта быстрая статья иллюстрирует несколько способов объединения массива примитивов с заданным символом-разделителем или строкой. Мы показали примеры использования собственных JDK-решений, а также дополнительные решения с использованием двух сторонних библиотек - Apache Commons Lang и Guava.
Как всегда, полный код, использованный в этой статье, доступенover on GitHub.