java - streams - ¿Por qué StringJoiner cuando ya tenemos StringBuilder?
java stringjoiner example (4)
Recientemente me encontré con una clase Java 8 StringJoiner
que agrega String usando los delimitadores y le agrega prefijos y sufijos, pero no puedo entender la necesidad de esta clase ya que también usa StringBuilder
en el back-end y también realiza operaciones muy simples de añadiendo las cadenas.
¿Me estoy perdiendo algo al no entender realmente el verdadero propósito de esta clase?
Los ejemplos en el Javadoc StringJoiner son muy buenos para cubrir esto. Todo el punto para abstraer la elección del separador del acto de agregar entradas. por ejemplo, puede crear un carpintero, especificar el separador que se usará y pasarlo a una biblioteca para agregar elementos o viceversa.
The String "[George: Sally: Fred]" se puede construir de la siguiente manera:
StringJoiner sj = new StringJoiner(":", "[", "]"); sj.add("George").add("Sally").add("Fred"); String desiredString = sj.toString();
Se puede emplear un StringJoiner para crear salida formateada desde un Stream usando Collectors.joining (CharSequence). Por ejemplo:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", "));
Puede simplificar su código en algunos casos de uso:
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
es muy útil cuando necesitas unirte a Strings en un Stream
.
Como ejemplo, si tiene que seguir la Lista de cadenas:
final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");
Es mucho más simple de usar
final String collectJoin = strings.stream().collect(Collectors.joining(", "));
como lo sería con un StringBuilder
:
final String collectBuilder =
strings.stream().collect(Collector.of(StringBuilder::new,
(stringBuilder, str) -> stringBuilder.append(str).append(", "),
StringBuilder::append,
StringBuilder::toString));
StringJoiner
es una especie de recopilador , aunque no implementa la interfaz de Collector
. Simplemente se comporta como tal. Además puede pasar el delimitador, el prefijo y el sufijo, el StringJoiner
se puede emplear para crear salida formateada a partir de una Collectors.joining(CharSequence)
invoca Collectors.joining(CharSequence)
.
Esto es especialmente útil cuando se trabaja con flujos paralelos , porque en algún punto los lotes que se están procesando en paralelo necesitarán unirse y aquí es donde se lleva a cabo el StringJoiner
.