Новая поза для сращивания строк в Java 8: StringJoiner

Java

GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, почему бы тебе не прийти и не узнать?

существуетПочему Alibaba не рекомендует использовать «+» для конкатенации строк в циклах forВ этой статье мы представили несколько методов конкатенации строк в Java, а также их преимущества и недостатки. Существует также важный метод сплайсинга, который я не представил, а именно StringJoiner, представленный в Java 8. В этой статье будут представлены новички в этом сплайсинге строк.

Если вы хотите узнать, сколько способов объединения строк, я научу вас простому методу. В Intellij IDEA определите Java Bean, а затем попробуйте использовать сочетание клавиш для автоматического создания метода toString. IDEA предложит вам сгенерировать различные стратегии toString на выбор.

В настоящее время стратегия генерации toString в IDEA, которую я использую, по умолчанию использует StringJoiner, предоставляемый JDK 1.8.

вводить

StringJoiner — это класс в пакете java.util, который создает (необязательную) последовательность символов, разделенных разделителем, и может начинаться с предоставленного префикса и заканчиваться предоставленным суффиксом. Хотя также возможно добавлять разделители после каждой строки с помощью класса StringBuilder, StringJoiner предоставляет простой способ сделать это без написания большого количества кода.

Класс StringJoiner имеет 2 конструктора и 5 общедоступных методов. Наиболее часто используемые методы — это метод add и метод toString, которые аналогичны методу append и методу toString в StringBuilder.

использование

Использование StringJoiner относительно просто.В следующем коде мы используем StringJoiner для объединения строк.

public class StringJoinerTest {

    public static void main(String[] args) {
        StringJoiner sj = new StringJoiner("Hollis");

        sj.add("hollischuang");
        sj.add("Java干货");
        System.out.println(sj.toString());

        StringJoiner sj1 = new StringJoiner(":","[","]");

        sj1.add("Hollis").add("hollischuang").add("Java干货");
        System.out.println(sj1.toString());
    }
}

Вывод приведенного выше кода:

hollischuangHollisJava干货
[Hollis:hollischuang:Java干货]

Стоит отметить, что когда мыStringJoiner(CharSequence delimiter)инициализироватьStringJoinerкогда этоdelimiterФактически это разделитель, а не начальное значение переменной строки.

StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)Второй и третий аргументы — это префикс и суффикс объединенной строки соответственно.

принцип

После введения в простое использование, давайте взглянем на принцип этого StringJoiner и посмотрим, как он реализован. В основном посмотрите на метод добавления:

public StringJoiner add(CharSequence newElement) {
    prepareBuilder().append(newElement);
    return this;
}

private StringBuilder prepareBuilder() {
    if (value != null) {
        value.append(delimiter);
    } else {
        value = new StringBuilder().append(prefix);
    }
    return value;
}

Увидел знакомую фигуру — StringBuilder, да, StringJoiner на самом деле реализован с опорой на StringBuilder.Почему Alibaba не рекомендует использовать «+» для конкатенации строк в циклах forВ этой статье мы представили принцип реализации StringBuilder, который не будет повторяться в этой статье.

Когда мы узнали, что StringJoiner на самом деле реализован в StringBuilder, мы, наверное, догадались,Его потеря производительности должна быть аналогична прямому использованию StringBuilder.!

Зачем вам StringJoiner

После понимания использования и принципа StringJoiner у многих читателей может возникнуть вопрос, очевидно, что StringBuilder уже существует, почему StringJoiner должен быть определен в Java 8? Какая польза?

Если читатель знает достаточно о Java 8, вы можете догадаться, что это должно быть связано со Stream.

Автор такжеJava docНашел ответ в:

A StringJoiner may be employed to create formatted output from a Stream using Collectors.joining(CharSequence)

Представьте, что в Java у нас есть такой список:

List<String> list = ImmutableList.of("Hollis","hollischuang","Java干货");

Если мы хотим объединить его в строку вида:

Hollis,hollischuang,Java干货

Это можно сделать:

StringBuilder builder = new StringBuilder();

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.toString();

Также используйте:

list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();

Но выходной результат немного отличается и должен быть обработан дважды:

Hollis,hollischuang,Java干货,

Вы также можете использовать «+» для соединения:

list.stream().reduce((a,b)->a + "," + b).toString();

Для вышеперечисленных методов либо сложный код, либо невысокая производительность, либо невозможно получить желаемые результаты напрямую.

Для удовлетворения таких потребностей пригодится StringJoiner, представленный в Java 8. Вышеуказанные требования требуют только одной строки кода:

list.stream().collect(Collectors.joining(":"))

Вот и все. В использованном выше выражении исходный код Collectors.joining выглядит следующим образом:

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);
}

Принцип его реализации заключается в использовании StringJoiner.

Конечно, может бытьCollectorиспользовать непосредственно вStringBuilderКажется, что аналогичную функцию можно реализовать, но она немного более громоздка. Итак, Java 8 предоставляетStringJoinerобогащатьStreamиспользование.

иStringJoinerТакже удобно добавлять префиксы и суффиксы, например, строка, которую мы хотим получить, имеет вид[Hollis,hollischuang,Java干货]вместоHollis,hollischuang,JavaДля галантереи преимущества StringJoiner еще более очевидны.

Суммировать

В этой статье представлен класс изменяемой строки, представленный в Java 8 — StringJoiner, который можно использовать для конкатенации строк.

StringJoiner на самом деле реализован StringBuilder, поэтому его производительность аналогична StringBuilder, и он также не является потокобезопасным.

Если при ежедневной разработке требуется сращивание строк, что выбрать?

1. Если это простая конкатенация строк, рассмотрите возможность прямого использования «+».

2. Если вы объединяете строки в цикле for, рассмотрите возможность использованияStringBuilderиStringBuffer.

3. Если черезListДля конкатенации строк рассмотрите возможность использованияStringJoiner.

GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, почему бы тебе не прийти и не узнать?

GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, ты правда не хочешь узнать?

GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, ты действительно уверен, что не хочешь узнать?