1. Введение
В этом кратком руководстве мы узнаем, как объединить массив примитивов с односимвольным разделителем в 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 , так как
некоторые методы, которые мы покажем, требуют аргумента char
, а другие требуют аргумента String
.
Результаты операции соединения будут содержать «1-2-3-4-5-6-7-8-9»
для массива int
и «abcdef»
для массива char .
3. Коллекторы.соединение()
Начнем с одного из доступных методов Java 8 Stream API — Collectors.joining()
.
Во-первых, мы создаем Stream
из массива примитивов, используя метод Arrays.stream()
из пакета java.util
. Затем мы сопоставляем каждый элемент со строкой
. И, наконец, мы объединяем элементы с заданным разделителем.
Начнем с нашего массива int :
String joined = Arrays.stream(intArray)
.mapToObj(String::valueOf)
.collect(Collectors.joining(separator));
При объединении нашего массива символов
с помощью этого метода мы должны сначала обернуть массив символов в CharBuffer
,
а затем снова спроецировать его в char
. Это связано с тем, что метод chars()
возвращает поток
значений int
.
К сожалению, Java Stream API не предоставляет собственного метода для упаковки Stream
из char
.
Давайте присоединимся к нашему массиву символов :
String joined = CharBuffer.wrap(charArray).chars()
.mapToObj(intValue -> String.valueOf((char) intValue))
.collect(Collectors.joining(separator));
4. Объединение строк
Подобно Collectors.joining()
, этот подход использует Stream API, но вместо сбора элементов он перебирает элементы и добавляет их в экземпляр StringJoiner
:
StringJoiner intStringJoiner = new StringJoiner(separator);
Arrays.stream(intArray)
.mapToObj(String::valueOf)
.forEach(intStringJoiner::add);
String joined = intStringJoiner.toString();
Опять же, мы должны обернуть наш массив символов в 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
Библиотека Apache Commons Lang предоставляет несколько удобных методов в классах StringUtils
и ArrayUtils
, которые мы можем использовать для объединения наших примитивных массивов.
Чтобы использовать эту библиотеку, нам нужно добавить зависимость commons-lang3
к нашему pom.xml
: ``
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
При работе с разделителем строк
мы будем использовать как StringUtils,
так и ArrayUtils
.
Давайте используем их вместе, чтобы присоединиться к нашему массиву int :
String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);
Или, если мы используем примитивный тип char
в качестве разделителя, мы можем просто написать:
String joined = StringUtils.join(intArray, separatorChar);
Реализации для объединения нашего массива символов
очень похожи:
String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);
И при использовании разделителя символов :
String joined = StringUtils.join(charArray, separatorChar);
6. Гуава
Библиотека Google Guava предоставляет класс Joiner
, который мы можем использовать для объединения наших массивов. Чтобы использовать Guava в нашем проекте, нам нужно добавить зависимость guava
Maven :
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Давайте присоединимся к нашему массиву int
, используя класс Joiner :
String joined = Joiner.on(separator).join(Ints.asList(intArray));
В этом примере мы также использовали метод Ints.asList()
из Guava, который прекрасно преобразует массив примитивов в список
Integer
.
Guava предлагает аналогичный метод преобразования массива символов в
список
символов .
В результате объединение нашего массива char
очень похоже на приведенный выше пример, в котором использовался массив int :
String joined = Joiner.on(separator).join(Chars.asList(charArray));
7. Построитель строк
Наконец, если мы не можем использовать ни Java 8, ни сторонние библиотеки, мы можем вручную объединить массив элементов с помощью 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.
Как всегда, полный код, использованный в этой статье, доступен на GitHub .