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?
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));
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(", "));
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);
}
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.
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