739 Stimmen

Java: Umwandlung von List<String> in einen join()d String

JavaScript hat Array.join()

js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve

Gibt es so etwas auch in Java? Ich weiß, dass ich selbst etwas zusammenschustern kann mit StringBuilder :

static public String join(List<String> list, String conjunction)
{
   StringBuilder sb = new StringBuilder();
   boolean first = true;
   for (String item : list)
   {
      if (first)
         first = false;
      else
         sb.append(conjunction);
      sb.append(item);
   }
   return sb.toString();
}

aber es hat keinen Sinn, dies zu tun, wenn so etwas bereits Teil des JDK ist.

1 Stimmen

Siehe auch diese Frage für Listen

20 Stimmen

Nicht streng verwandt, aber Android hat eine eingebaute Join-Funktion als Teil ihrer TextUtils-Klasse: [developer.Android.com/reference/Android/text/](http://developer.android.com/reference/android/text/TextUtils.html#join(java.lang.CharSequence) , java.lang.Iterable)

18 Stimmen

Java 8 hat eine String.join() Methode. Werfen Sie einen Blick auf diese Antwort, wenn Sie Java 8 (oder neuer) verwenden stackoverflow.com/a/22577565/1115554

965voto

micha Punkte 45016

Mit Java 8 können Sie dies ohne eine Bibliothek von Drittanbietern tun.

Wenn Sie einer Sammlung von Strings beitreten möchten, können Sie die neue String.join() Methode:

List<String> list = Arrays.asList("foo", "bar", "baz");
String joined = String.join(" and ", list); // "foo and bar and baz"

Wenn Sie eine Sammlung mit einem anderen Typ als String haben, können Sie die Stream API mit der Beitritt Sammler :

List<Person> list = Arrays.asList(
  new Person("John", "Smith"),
  new Person("Anna", "Martinez"),
  new Person("Paul", "Watson ")
);

String joinedFirstNames = list.stream()
  .map(Person::getFirstName)
  .collect(Collectors.joining(", ")); // "John, Anna, Paul"

El StringJoiner Klasse kann ebenfalls nützlich sein.

9 Stimmen

Leider akzeptiert String.join nur CharSequences und nicht, wie man hoffen würde, Objects. Nicht einmal sicher, ob es nullsicher ist

0 Stimmen

@Marc assertThat(String.join(", ", Lists.newArrayList("1", null)), is("1, null"));

0 Stimmen

StringJoiner ist besonders nützlich, wenn man eine Verbindung zu etwas wie [a, b, c] einschließlich der Klammern.

308voto

Cowan Punkte 36327

Alle Verweise auf Apache Commons sind in Ordnung (und das ist es, was die meisten Leute benutzen), aber ich denke, die Guave gleichwertig, Tischler hat eine viel schönere API.

Sie können den einfachen Join-Fall mit

Joiner.on(" and ").join(names)

sondern auch leicht mit Nullen umgehen:

Joiner.on(" and ").skipNulls().join(names);

oder

Joiner.on(" and ").useForNull("[unknown]").join(names);

und (für mich nützlich genug, um es der Commons-Sprache vorzuziehen), die Fähigkeit, mit Maps umzugehen:

Map<String, Integer> ages = .....;
String foo = Joiner.on(", ").withKeyValueSeparator(" is ").join(ages);
// Outputs:
// Bill is 25, Joe is 30, Betty is 35

was für die Fehlersuche usw. äußerst nützlich ist.

11 Stimmen

Danke für die Werbung! Unser Joiner gibt Ihnen auch die Möglichkeit, direkt an einen Appendable (wie einen StringBuilder oder einen Writer) anzuhängen, ohne Zwischenstrings zu erstellen, was der Apache-Bibliothek zu fehlen scheint.

2 Stimmen

Das ist großartig, aber können Sie bitte eine .useForLastSeparator() oder eine ähnliche Methode? Auf diese Weise könnten Sie etwas wie ", und " nur zwischen den letzten beiden Einträgen erhalten (mit ", " für den Rest).

2 Stimmen

Ja, es ist fadensicher. Der einzige Zustand, der in einem Joiner gespeichert wird, ist die separator (das ist final ). Alles, was ich in Guava gesehen habe, wo ich früher ein Apache-Commons-Äquivalent verwendet habe, war in Guava so viel besser (sprich: sauberer, schneller, sicherer und einfach robuster im Allgemeinen), mit weniger Fehlern in Randfällen und Thread-Sicherheitsproblemen und geringerem Speicherbedarf. Der Leitsatz "bestmöglich" scheint sich bisher zu bewahrheiten.

147voto

Arne Burmeister Punkte 19217

Das ist nicht selbstverständlich, aber viele Bibliotheken haben ähnliche Angebote:

Commons Lang:

org.apache.commons.lang.StringUtils.join(list, conjunction);

Frühling:

org.springframework.util.StringUtils.collectionToDelimitedString(list, conjunction);

138voto

Rafal Enden Punkte 2678

Auf Android könnten Sie verwenden TextUtils Klasse.

TextUtils.join(" and ", names);

14 Stimmen

Danach habe ich gesucht. String.join erfordert min api Stufe 26 auf Android.

51voto

Bart Kiers Punkte 160101

Nein, in der Standard-Java-API gibt es keine solche Komfortmethode.

Es überrascht nicht, dass Apache Commons so etwas anbietet in ihrer StringUtils-Klasse für den Fall, dass Sie es nicht selbst schreiben wollen.

11 Stimmen

Es hat mich schon immer gestört, dass String einen Split, aber keinen Join hat. In gewisser Weise macht es Sinn, aber es ist einfach ärgerlich, dass es nicht zumindest eine statische Methode für sie in String.

4 Stimmen

Ich stimme Ihnen zu, Bemrose. Wenigstens haben sie uns eine isEmpty() Methode anstelle einer (statischen) join() Methode in String ... :rollseyes: :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X