Подтвердить что ты не робот

Почему StringJoiner, когда у нас уже есть StringBuilder?

Недавно я столкнулся с Java 8 class StringJoiner, который добавляет String с помощью разделителей и добавляет к нему префикс и суффикс, но я не могу понять необходимость этого класса, поскольку он также использует StringBuilder на бэкэнд а также выполняет очень простую операцию добавления строк.

Я что-то пропустил, не понимая реальной цели этого класса?

4b9b3361

Ответ 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.