Java: как преобразовать List<String> в объединённую строку с помощью join()
В JavaScript есть метод Array.join()
:
js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve
Существует ли что-то подобное в Java? Я понимаю, что могу самостоятельно реализовать это с помощью StringBuilder
:
static public String join(List<String> list, String conjunction)
{
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String item : list)
{
if (first)
first = false;
else
sb.append(conjunction);
sb.append(item);
}
return sb.toString();
}
.. но нет смысла это реализовывать, если что-то подобное уже есть в JDK.
5 ответ(ов)
В Android вы можете использовать класс TextUtils для объединения строк. Например, вы можете использовать метод join
, чтобы соединить элементы массива строк с заданным разделителем. Вот пример кода:
TextUtils.join(" и ", names);
В этом примере все элементы массива names
будут объединены в одну строку, разделённые словом " и ".
Не из коробки, но многие библиотеки предлагают аналогичные решения:
Commons Lang:
org.apache.commons.lang.StringUtils.join(list, conjunction);
Spring:
org.springframework.util.StringUtils.collectionToDelimitedString(list, conjunction);
Если у вас есть конкретные требования или контекст, может быть полезно уточнить, чтобы предложить более подходящее решение.
В Java 8 у вас есть три возможных способа соединить элементы списка строк с помощью разделителя:
- Использование
String.join
:
List<String> list = Arrays.asList("Alice", "Bob", "Charlie");
String result = String.join(" and ", list);
Этот способ наиболее простой и читаемый, он объединяет строки с указанным разделителем.
- Использование
Collectors.joining
:
String result = list.stream().collect(Collectors.joining(" and "));
Этот подход использует стримы и предоставляет больше возможностей для сложных операций над данными, включая не только соединение, но и фильтрацию или преобразование элементов.
- Использование
reduce
:
String result = list.stream().reduce((t, u) -> t + " and " + u).orElse("");
Метод reduce
позволяет вам использовать аккумулятор для объединения значений. Этот способ более гибкий, но может быть менее интуитивно понятным для простого соединения строк.
Каждый из этих методов имеет свои преимущества, и выбор зависит от конкретных требований вашего проекта.
С помощью коллектора в Java 8 это можно сделать следующим образом:
Arrays.asList("Bill", "Bob", "Steve").stream()
.collect(Collectors.joining(" and "));
Также, самое простое решение в Java 8 выглядит так:
String.join(" and ", "Bill", "Bob", "Steve");
или
String.join(" and ", Arrays.asList("Bill", "Bob", "Steve"));
Эти подходы позволяют объединить строки с указанным разделителем " and ".
Ваш код для объединения элементов коллекции в строку выглядит неплохо, и вы правильно заметили, что Collection
не поддерживается в JSP. Вместо этого, вы реализовали метод для List
, что также является логичным решением. Позвольте мне кратко объяснить ваш код и предложить некоторые улучшения.
Ваш первый метод join(Collection<?> col, String delim)
предназначен для объединения элементов любой коллекции в строку с заданным разделителем, используя StringBuilder
. Это хорошо работает для toString()
вашего объекта. Это не может быть использовано в JSP, потому что Collection
не может быть передан в TLD.
Поэтому вы написали альтернативу для List
, которая также выполняет свою задачу. Однако вы можете слегка оптимизировать второй метод. Например, вместо вызова toString()
на каждом элементе, стоит использовать String.valueOf()
, чтобы обработать возможные null
значения, избегая потенциальных NullPointerException
.
Вот обновленный вариант:
public static String join(List<?> list, String delim) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(String.valueOf(list.get(0)));
for (int i = 1; i < len; i++) {
sb.append(delim);
sb.append(String.valueOf(list.get(i)));
}
return sb.toString();
}
Кроме того, в вашем TLD-файле проверьте, чтобы XML был корректным, добавив закрывающий тег для </taglib>
:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee">
<function>
<name>join</name>
<function-class>com.core.util.ReportUtil</function-class>
<function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
</function>
</taglib>
Итак, использование в JSP все так же остается без изменений:
<%@ taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt" %>
${funnyFmt:join(books, ", ")}
Эти изменения сделают ваш код чуть более устойчивым и надежным.
Как преобразовать строку в int в Java?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как сгенерировать случайную алфавитно-цифровую строку
Как преобразовать Map в List в Java?
Преобразование всех строк в списке в целые числа