Присоединиться к массиву примитивов с разделителем в Java

Присоединиться к массиву примитивов с разделителем в 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.