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

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. Collectors.joining ()

Нека започнем с един от наличните методи от API 8 Stream API - Collectors.joining () .

Първо, ние създаваме поток от масив примитиви, използвайки метода Arrays.stream () , намерен в пакета java.util . След това картографираме всеки елемент в String . И накрая, обединяваме елементите с дадения ни разделител.

Нека започнем с нашия масив int :

String joined = Arrays.stream(intArray) .mapToObj(String::valueOf) .collect(Collectors.joining(separator));

Когато се присъединявате към нашия масив char с този метод, първо трябва да обвием масива char в CharBuffer и след това да го проектираме отново на char . Това е така, защото методът chars () връща поток от int стойности.

За съжаление, API на Java 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();

Отново трябва да обгърнем нашия char масив в 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-lang3 към нашия pom.xml :

 org.apache.commons commons-lang3 3.8.1 

Когато работим с разделител на низове , ще използваме както 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);

И когато използвате разделител на символи :

String joined = StringUtils.join(charArray, separatorChar);

6. Гуава

Библиотеката на Гуава на Google предоставя клас Joiner, който можем да използваме, за да се присъединим към нашите масиви. За да използваме Guava в нашия проект, ще трябва да добавим зависимостта на guava Maven:

 com.google.guava guava 27.0.1-jre 

Нека се присъединим към нашия масив int, използвайки класа Joiner :

String joined = Joiner.on(separator).join(Ints.asList(intArray));

В този пример използвахме и метода Ints.asList () от Guava, който добре трансформира масива от примитиви в Списък на цяло число .

Guava предлага подобен метод за преобразуване на масив char в списък с символи. В резултат присъединяването към нашия масив char изглежда много подобно на горния пример, който използва масива int :

String joined = Joiner.on(separator).join(Chars.asList(charArray));

7. StringBuilder

И накрая, ако не можем да използваме нито 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.