Java 8 StringJoiner
1. Вступление
StringJoiner - это новый класс, добавленный в Java 8 в пакетjava.util.
Проще говоря,it can be used for joining Strings making use of a delimiter, prefix, and suffix.
2. Добавление элементов
Мы можем добавитьStrings с помощью метода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 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. строительство
To construct an instance of StringJoiner, we need to mention the delimiter. По желанию, мы также можем указать префикс и суффикс, которые должны присутствовать в результате:
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(), чтобы получить текущее значение от соединителя.
Обратите внимание на значения по умолчанию, возвращаемые столярами. A Joiner without prefix and suffix returns an empty String whereas joiner with prefix and suffix returns a String containing both prefix and suffix.с
Мы можем изменить возвращаемый по умолчаниюString, используя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(). Он добавляет содержимое заданногоStringJoinerwithout prefix and suffix в качестве следующего элемента:
@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. Stream API
Это почти все, что мы можем сделать сStringJoiner.
Есть еще одно косвенное использование, которое можно найти в APIStream:
@Test
public void whenUsedWithinCollectors_thenJoined() {
List 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 кажется очень примитивным и не учитывает некоторые базовые варианты использования, такие как соединение элементов списка. Похоже, он в первую очередь предназначен дляCollectors.
ЕслиStringJoiner не соответствует нашим требованиям, существуют другие популярные и мощные библиотеки, такие какGuava.
И, как обычно, можно найти все источникиover on GitHub.