Почему StringJoiner, когда у нас уже есть StringBuilder?
Недавно я столкнулся с Java 8 class StringJoiner
, который добавляет String с помощью разделителей и добавляет к нему префикс и суффикс, но я не могу понять необходимость этого класса, поскольку он также использует StringBuilder
на бэкэнд а также выполняет очень простую операцию добавления строк.
Я что-то пропустил, не понимая реальной цели этого класса?
Ответы
Ответ 1
StringJoiner
очень полезен, когда вам нужно присоединиться к строкам в Stream
.
В качестве примера, если вам нужно следовать списку строк:
final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");
Гораздо проще использовать
final String collectJoin = strings.stream().collect(Collectors.joining(", "));
как это было бы с StringBuilder
:
final String collectBuilder =
strings.stream().collect(Collector.of(StringBuilder::new,
(stringBuilder, str) -> stringBuilder.append(str).append(", "),
StringBuilder::append,
StringBuilder::toString));
Ответ 2
Примеры на StringJoiner Javadoc очень хороши в этом. Весь смысл абстрагироваться от выбора seperator от акта добавления записей. например вы можете создать столяр, указать используемого разделителя и передать его в библиотеку для добавления элементов или наоборот.
Строка "[George: Sally: Fred]" может быть построена следующим образом:
StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();
StringJoiner может использоваться для создания форматированного вывода из потока с использованием Collectors.joining(CharSequence). Например:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
.map(i -> i.toString())
.collect(Collectors.joining(", "));
Ответ 3
Это может упростить ваш код в некоторых случаях:
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);
}
Ответ 4
StringJoiner
- это своего рода коллекционер, хотя он не реализует интерфейс Collector
. Он просто ведет себя как таковой. Кроме того, вы можете передавать разделитель, префикс и суффикс, StringJoiner
может использоваться для создания форматированного вывода из Stream
вызывающего Collectors.joining(CharSequence)
.
Это особенно полезно при работе с параллельными потоками, потому что в какой-то момент партии, которые являются параллельными процессами, необходимо будет соединить, и именно здесь происходит StringJoiner
.