web-dev-qa-db-fra.com

Pourquoi StringJoiner alors que nous avons déjà StringBuilder?

J'ai récemment rencontré un Java 8 class StringJoiner qui ajoute la chaîne à l'aide des délimiteurs et y ajoute un préfixe et un suffixe, mais je ne peux pas comprendre la nécessité de cette classe car elle utilise également StringBuilder au niveau du serveur et effectue également une opération très simple d’ajout des chaînes.

Est-ce que je manque quelque chose en ne comprenant pas réellement le but réel de cette classe?

52
Hitesh Garg

StringJoiner est très utile lorsque vous devez joindre Strings dans un Stream.

Par exemple, si vous devez suivre List of Strings:

final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");

C'est beaucoup plus simple à utiliser

final String collectJoin = strings.stream().collect(Collectors.joining(", "));

comme avec un StringBuilder:

final String collectBuilder =
    strings.stream().collect(Collector.of(StringBuilder::new,
        (stringBuilder, str) -> stringBuilder.append(str).append(", "),
        StringBuilder::append,
        StringBuilder::toString));
65
Martin Seeler

Les exemples sur le StringJoiner Javadoc sont très efficaces pour couvrir cela. Le tout est de faire abstraction du choix de séparateur de l'acte consistant à ajouter des entrées. par exemple. vous pouvez créer un menuisier, spécifier le séparateur à utiliser et le transmettre à une bibliothèque pour effectuer l'ajout d'éléments ou inversement.

La chaîne "[George: Sally: Fred]" peut être construite comme suit:

StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();

Un StringJoiner peut être utilisé pour créer une sortie formatée à partir d'un flux à l'aide de Collectors.joining (CharSequence). Par exemple:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
    .map(i -> i.toString())
    .collect(Collectors.joining(", "));
22
Peter Lawrey

Cela peut simplifier votre code dans certains cas d'utilisation:

List<String> list = // ...;

// with StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("[");
if (!list.isEmpty()) {
    builder.append(list.get(0));
    for (int i = 1, n = list.size(); i < n; i++) {
        builder.append(",").append(list.get(i));
    }
}
builder.append("]");

// with StringJoiner
StringJoiner joiner = new StringJoiner(",", "[", "]");
for (String element : list) {
    joiner.add(element);
}
14
sp00m

StringJoiner est une sorte de collecteur , bien qu'il n'implémente pas l'interface Collector. Il se comporte simplement comme tel. Outre que vous pouvez passer le délimiteur, le préfixe et le suffixe, le StringJoiner peut être utilisé pour créer une sortie formatée à partir d'un Stream appelant Collectors.joining(CharSequence).

Ceci est particulièrement utile lorsque vous travaillez avec flux parallèles, car à un moment donné, les lots en cours de traitement en parallèle devront être joints et c'est là que le StringJoiner a lieu.

11
Konstantin Yovkov

StringJoiner est beaucoup plus simple que d'utiliser StringBuilder. Un code très simple est comme

StringJoiner sj = new StringJoiner(",");
        sj.add("aaa");
        sj.add("bbb");
        sj.add("ccc");
        String result = sj.toString(); //aaa,bbb,ccc
3
Shubham Pandey