Изменяемое сокращение в объект StringBuilder - PullRequest
0 голосов
/ 28 октября 2019

В соответствии с Сводка пакета Java Stream ,
Операция сокращения с изменением накапливает элементы ввода в изменяемый контейнер результатов, такой как Collection или StringBuilder , какон обрабатывает элементы в потоке.

Существует множество примеров выполнения изменяемого сокращения в коллекцию. Однако я не могу понять, как реализовать изменяемую операцию сокращения в StringBuilder, особенно учитывая, что StringBuilder, по-видимому, не является частью какого-либо соответствующего определения интерфейса.

1 Ответ

3 голосов
/ 28 октября 2019

Вы не видите StringBuilder, потому что результат использования StringBuilder равен String. StringBuilder используется за кулисами.

Пример

String[] input = { "Hell", "oW", "orld" };
String joined = Stream.of(input).collect(Collectors.joining());
System.out.println(joined); // prints: HelloWorld

Если вы сделаете это без потоковой передачи, вы сделаете:

StringBuilder buf = new StringBuilder();
for (String s : input)
    buf.append(s);
String joined = buf.toString();

Это также то, что делает поток. Если вы посмотрите на исходный код joining(), вы увидите:

public static Collector<CharSequence, ?, String> joining() {
    return new CollectorImpl<CharSequence, StringBuilder, String>(
            StringBuilder::new, StringBuilder::append,
            (r1, r2) -> { r1.append(r2); return r1; },
            StringBuilder::toString, CH_NOID);
}

Как видите, он также использует new StringBuilder(),append(CharSequence s) и toString().

Две другие перегрузки, joining(CharSequence delimiter) и joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix), используйте StringJoiner вместо StringBuilder.

public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
    return joining(delimiter, "", "");
}

public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
                                                         CharSequence prefix,
                                                         CharSequence suffix) {
    return new CollectorImpl<>(
            () -> new StringJoiner(delimiter, prefix, suffix),
            StringJoiner::add, StringJoiner::merge,
            StringJoiner::toString, CH_NOID);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...