Перейти к основному содержимому

Java 8 StringJoiner

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Введение

StringJoiner — это новый класс, добавленный в Java 8 в пакете java.util .

Проще говоря, его можно использовать для объединения строк с использованием разделителя, префикса и суффикса.

2. Добавление элементов

Мы можем добавить строки , используя метод add() :

@Test
public void whenAddingElements_thenJoinedElements() {
StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
joiner.add("Red")
.add("Green")
.add("Blue");

assertEquals(joiner.toString(), "[Red,Green,Blue]");
}

Если мы хотим соединить все элементы списка, нам придется пройтись по списку в цикле. К сожалению, нет простого способа сделать это с помощью StringJoiner :

@Test
public void whenAddingListElements_thenJoinedListElements() {
List<String> rgbList = new ArrayList<>();
rgbList.add("Red");
rgbList.add("Green");
rgbList.add("Blue");

StringJoiner rgbJoiner = new StringJoiner(
",", PREFIX, SUFFIX);

for (String color : rgbList) {
rgbJoiner.add(color);
}

assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]");
}

3. Строительство

Чтобы создать экземпляр StringJoiner, нам нужно указать разделитель. При желании мы также можем указать префикс и суффикс, которые должны присутствовать в результате:

private String PREFIX = "[";
private String SUFFIX = "]";

@Test
public void whenEmptyJoinerWithoutPrefixSuffix_thenEmptyString() {
StringJoiner joiner = new StringJoiner(",");

assertEquals(0, joiner.toString().length());
}

@Test
public void whenEmptyJoinerJoinerWithPrefixSuffix_thenPrefixSuffix() {
StringJoiner joiner = new StringJoiner(
",", PREFIX, SUFFIX);

assertEquals(joiner.toString(), PREFIX + SUFFIX);
}

Мы используем toString() для получения текущего значения от столяра.

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

Мы можем изменить строку по умолчанию , возвращаемую с помощью setEmptyValue() :

@Test
public void whenEmptyJoinerWithEmptyValue_thenDefaultValue() {
StringJoiner joiner = new StringJoiner(",");
joiner.setEmptyValue("default");

assertEquals(joiner.toString(), "default");
}

@Test
public void whenEmptyJoinerWithPrefixSuffixAndEmptyValue_thenDefaultValue() {
StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
joiner.setEmptyValue("default");

assertEquals(joiner.toString(), "default");
}

Здесь оба соединителя возвращают константу EMPTY_JOINER .

Значение по умолчанию возвращается, только если StringJoiner пуст.

4. Объединение столяров

Мы можем объединить два столяра, используя merge() . Он добавляет содержимое данного StringJoiner без префикса и суффикса в качестве следующего элемента:

@Test
public void whenMergingJoiners_thenReturnMerged() {
StringJoiner rgbJoiner = new StringJoiner(
",", PREFIX, SUFFIX);
StringJoiner cmybJoiner = new StringJoiner(
"-", PREFIX, SUFFIX);

rgbJoiner.add("Red")
.add("Green")
.add("Blue");
cmybJoiner.add("Cyan")
.add("Magenta")
.add("Yellow")
.add("Black");

rgbJoiner.merge(cmybJoiner);

assertEquals(
rgbJoiner.toString(),
"[Red,Green,Blue,Cyan-Magenta-Yellow-Black]");
}

Обратите внимание, как «-» используется для объединения содержимого cmybJoiner , в то время как rgbJoiner по- прежнему использует «,».

5. Потоковое API

Это практически все, что мы можем сделать с помощью StringJoiner .

Есть еще одно косвенное использование, которое можно найти в Stream API:

@Test
public void whenUsedWithinCollectors_thenJoined() {
List<String> rgbList = Arrays.asList("Red", "Green", "Blue");
String commaSeparatedRGB = rgbList.stream()
.map(color -> color.toString())
.collect(Collectors.joining(","));

assertEquals(commaSeparatedRGB, "Red,Green,Blue");
}

Collectors.joining() внутренне использует StringJoiner для выполнения операции объединения.

6. Заключение

В этом кратком руководстве мы показали, как использовать класс StringJoiner . В целом StringJoiner кажется очень примитивным и не может справиться с некоторыми базовыми вариантами использования, такими как объединение элементов списка. Кажется, он в первую очередь предназначен для коллекционеров .

Если StringJoiner не соответствует нашим требованиям, есть другие популярные и мощные библиотеки, такие как Guava .

И, как обычно, все исходники можно найти на GitHub .