Bli med Array of Primitives with Separator i Java
1. Introduksjon
I denne raske opplæringen lærer vi hvordan du gjør det bli med i en rekke primitiver med en tegnseparator i Java. For eksemplene våre vil vi vurdere to matriser: en rekke int og en rekke røye.
2. Definere problemet
La oss starte med å definere en rekke int og en rekke røye for eksemplene, så vel som skilletegnet vi bruker for å bli med på innholdet:
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);
Merk at vi har tatt med begge a røye og String separator siden noen av metodene vi viser krever en røye argument, mens andre krever en String argument.
Resultatene av sammenføyningsoperasjonen vil inneholde “1-2-3-4-5-6-7-8-9” for int array, og "A B C D E F" for røye array.
3. Collectors.joining ()
La oss starte med en av de tilgjengelige metodene fra Java 8 Stream API - Collectors.joining ().
Først lager vi en Strøm fra en rekke primitiver som bruker Arrays.stream () metoden funnet i java.util pakke. Deretter tilordner vi hvert element til String. Og til slutt sammenkobler vi elementene med vår gitte separator.
La oss begynne med vår int matrise:
String joined = Arrays.stream (intArray) .mapToObj (String :: valueOf) .collect (Collectors.joining (separator));
Når du blir med på vår røye array med denne metoden, må vi først pakke inn røye rekke inn i CharBuffer og projiser den deretter til røye en gang til. Dette er fordi tegn () metoden returnerer a Strøm av int verdier.
Dessverre gir Java Stream API ikke en innfødt metode for innpakning av en Strøm av røye.
La oss bli med vår røye matrise:
String joined = CharBuffer.wrap (charArray) .chars () .mapToObj (intValue -> String.valueOf ((char) intValue)) .collect (Collectors.joining (separator));
4. StringJoiner
På samme måte som Collectors.joining (), denne tilnærmingen bruker Stream API, men i stedet for å samle inn elementer, går det gjennom elementer og legger dem til en StringJoiner forekomst:
StringJoiner intStringJoiner = ny StringJoiner (separator); Arrays.stream (intArray) .mapToObj (String :: valueOf) .forEach (intStringJoiner :: add); String joined = intStringJoiner.toString ();
Igjen, vi må pakke inn røye rekke inn i CharBuffer når du bruker Stream API:
StringJoiner charStringJoiner = ny 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-biblioteket gir noen nyttige metoder i StringUtils og ArrayUtils klasser som vi kan bruke til å bli med i våre primitive matriser.
For å bruke dette biblioteket, må vi legge til commons-lang3 avhengighet til vår pom.xml:
org.apache.commons commons-lang3 3.8.1
Når du arbeider med en String separator, bruker vi begge deler StringUtils og ArrayUtils.
La oss bruke disse sammen for å bli med int matrise:
String joined = StringUtils.join (ArrayUtils.toObject (intArray), separator);
Eller hvis vi bruker en primitiv røye skriv som separator, kan vi ganske enkelt skrive:
String joined = StringUtils.join (intArray, separatorChar);
Implementeringene for å bli med på vår røye array er ganske like:
String joined = StringUtils.join (ArrayUtils.toObject (charArray), separator);
Og når du bruker en røye skilletegn:
String joined = StringUtils.join (charArray, separatorChar);
6. Guava
Googles Guava-bibliotek tilbyr Snekker klasse som vi kan bruke til å bli med i arrangementene våre. For å bruke Guava i prosjektet vårt, må vi legge til guava Maven avhengighet:
com.google.guava guava 27.0.1-jre
La oss bli med vår int array ved hjelp av Snekker klasse:
String joined = Joiner.on (separator) .join (Ints.asList (intArray));
I dette eksemplet brukte vi også Ints.asList () metode fra Guava, som pent forvandler en rekke primitiver til en Liste av Heltall.
Guava tilbyr en lignende metode for å konvertere en røye array til en Liste av Karakter. Som et resultat, bli med i vår røye array ser veldig ut som eksemplet ovenfor som brukte int matrise:
String joined = Joiner.on (separator) .join (Chars.asList (charArray));
7. StringBuilder
Endelig, Hvis vi ikke kan bruke Java 8 eller tredjepartsbiblioteker, kan vi manuelt bli med i en rekke elementer med StringBuilder. I dette tilfellet er implementeringen identisk for begge typer matriser:
if (array.length == 0) {return ""; } StringBuilder stringBuilder = ny 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. Konklusjon
Denne raske artikkelen illustrerer en rekke måter å bli med i en rekke primitiver med et gitt skilletegn eller streng. Vi viste eksempler ved bruk av innfødte JDK-løsninger, samt tilleggsløsninger ved bruk av to tredjepartsbiblioteker - Apache Commons Lang og Guava.
Som alltid er den komplette koden som brukes i denne artikkelen tilgjengelig på GitHub.