7

Java: как преобразовать List<String> в объединённую строку с помощью join()

1

В 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 ответ(ов)

1

В Android вы можете использовать класс TextUtils для объединения строк. Например, вы можете использовать метод join, чтобы соединить элементы массива строк с заданным разделителем. Вот пример кода:

TextUtils.join(" и ", names);

В этом примере все элементы массива names будут объединены в одну строку, разделённые словом " и ".

1

Не из коробки, но многие библиотеки предлагают аналогичные решения:

Commons Lang:

org.apache.commons.lang.StringUtils.join(list, conjunction);

Spring:

org.springframework.util.StringUtils.collectionToDelimitedString(list, conjunction);

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

0

В Java 8 у вас есть три возможных способа соединить элементы списка строк с помощью разделителя:

  1. Использование String.join:
List<String> list = Arrays.asList("Alice", "Bob", "Charlie");
String result = String.join(" and ", list);

Этот способ наиболее простой и читаемый, он объединяет строки с указанным разделителем.

  1. Использование Collectors.joining:
String result = list.stream().collect(Collectors.joining(" and "));

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

  1. Использование reduce:
String result = list.stream().reduce((t, u) -> t + " and " + u).orElse("");

Метод reduce позволяет вам использовать аккумулятор для объединения значений. Этот способ более гибкий, но может быть менее интуитивно понятным для простого соединения строк.

Каждый из этих методов имеет свои преимущества, и выбор зависит от конкретных требований вашего проекта.

0

С помощью коллектора в 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 ".

0

Ваш код для объединения элементов коллекции в строку выглядит неплохо, и вы правильно заметили, что 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, ", ")}

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь