1. Обзор
В этом руководстве мы рассмотрим преобразование строки, разделенной запятыми, в
список строк
. Кроме того, мы преобразуем строку
целых чисел, разделенных запятыми, в список
целых чисел
.
2. Зависимости
Для некоторых методов, которые мы будем использовать для наших преобразований, требуются библиотеки Apache Commons Lang 3 и Guava . Итак, добавим их в наш файл pom.xml
:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
3. Определение нашего примера
Прежде чем мы начнем, давайте определим две входные строки, которые мы будем использовать в наших примерах. Первая строка, страны,
содержит несколько строк, разделенных запятой, а вторая строка, ранги,
включает числа, разделенные запятой:
String countries = "Russia,Germany,England,France,Italy";
String ranks = "1,2,3,4,5,6,7";
И на протяжении всего этого руководства мы будем преобразовывать приведенные выше строки в списки строк и целых чисел, которые мы будем хранить в:
List<String> convertedCountriesList;
List<Integer> convertedRankList;
Наконец, после того, как мы выполним наши преобразования, ожидаемые результаты будут следующими:
List<String> expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy");
List<Integer> expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
4. Базовая Java
В нашем первом решении мы преобразуем строку в список строк и целых чисел, используя ядро Java.
Во- первых, мы разделим нашу строку на массив строк , используя split,
служебный метод класса String .
Затем мы будем использовать Arrays.asList
для нашего нового массива строк, чтобы преобразовать его в список строк:
List<String> convertedCountriesList = Arrays.asList(countries.split(",", -1));
Давайте теперь превратим нашу строку чисел в список целых чисел.
Мы будем использовать метод разделения
для преобразования нашей строки чисел в массив строк. Затем мы преобразуем каждую строку в нашем новом массиве в целое число и добавим ее в наш список :
String[] convertedRankArray = ranks.split(",");
List<Integer> convertedRankList = new ArrayList<Integer>();
for (String number : convertedRankArray) {
convertedRankList.add(Integer.parseInt(number.trim()));
}
В обоих этих случаях мы используем служебный метод split
из класса String
, чтобы разделить строку, разделенную запятыми, на массив строк.
Обратите внимание, что перегруженный метод разделения
, используемый для преобразования строки наших стран
, содержит второй параметр limit
, для которого мы указали значение -1. Это указывает на то, что шаблон разделителя должен применяться как можно больше раз.
Метод разделения
, который мы использовали для разделения нашей строки целых чисел ( рангов
), использует ноль в качестве предела
, поэтому он игнорирует пустые строки, тогда как разделение
, используемое для строки стран
, сохраняет пустые строки в возвращаемом массиве.
5. Java-потоки
Теперь мы реализуем те же преобразования с помощью Java Stream API .
Во- первых, мы преобразуем строку наших стран
в массив строк, используя метод split
в классе String
. Затем мы будем использовать класс Stream
для преобразования нашего массива в список строк:
List<String> convertedCountriesList = Stream.of(countries.split(",", -1))
.collect(Collectors.toList());
Давайте посмотрим, как преобразовать нашу строку чисел в список целых чисел с помощью Stream.
Опять же, мы сначала преобразуем строку чисел в массив строк, используя метод
разделения
, и преобразуем полученный массив в поток
строк , используя метод of()
в классе Stream
.
``
Затем мы обрежем начальные и конечные пробелы каждой строки
в потоке
с помощью map(String:
: trim)
.
Затем мы применим map(Integer::parseInt)
к нашему потоку, чтобы преобразовать каждую строку в нашем потоке
в Integer
.
И, наконец, мы вызовем функцию collect(Collectors.toList())
для потока
, чтобы преобразовать его в целочисленный список:
List<Integer> convertedRankList = Stream.of(ranks.split(","))
.map(String::trim)
.map(Integer::parseInt)
.collect(Collectors.toList());
6. Язык Apache Commons
В этом решении мы будем использовать библиотеку Apache Commons Lang3 для выполнения наших преобразований. Apache Commons Lang3 предоставляет несколько вспомогательных функций для управления основными классами Java.
Во-первых, мы разделим нашу строку на массив строк, используя StringUtils.splitPreserveAllTokens
.
Затем мы преобразуем наш новый массив строк в список, используя метод Arrays.asList
:
List<String> convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));
Давайте теперь преобразуем нашу строку чисел в список целых чисел.
Мы снова воспользуемся методом StringUtils.split
для создания массива строк из нашей строки. Затем мы преобразуем каждую строку в нашем новом массиве в целое число, используя Integer.parseInt,
и добавим преобразованное целое число в наш список:
String[] convertedRankArray = StringUtils.split(ranks, ",");
List<Integer> convertedRankList = new ArrayList<Integer>();
for (String number : convertedRankArray) {
convertedRankList.add(Integer.parseInt(number.trim()));
}
В этом примере мы использовали метод splitPreserveAllTokens
для разделения строки наших стран
, тогда как мы использовали метод разделения
для разделения строки наших рангов .
Несмотря на то, что обе эти функции разбивают строку на массив, splitPreserveAllTokens
сохраняет все токены, включая пустые строки, созданные соседними разделителями, тогда как метод split
игнорирует пустые строки .
Итак, если у нас есть пустые строки, которые мы хотим включить в наш список, то мы должны использовать splitPreserveAllTokens
вместо split
.
7. Гуава
Наконец, мы будем использовать библиотеку Guava для преобразования наших строк в соответствующие списки.
Чтобы преобразовать строку наших стран
, мы сначала вызовем Splitter.on
с запятой в качестве параметра, чтобы указать, на какой символ должна быть разделена наша строка.
Затем мы будем использовать метод trimResults
в нашем экземпляре Splitter .
Это будет игнорировать все начальные и конечные пробелы из созданных подстрок.
Наконец, мы будем использовать метод splitToList
, чтобы разделить нашу входную строку и преобразовать ее в список:
List<String> convertedCountriesList = Splitter.on(",")
.trimResults()
.splitToList(countries);
Теперь давайте преобразуем строку чисел в список целых чисел .
Мы снова преобразуем строку чисел в список строк `` , используя тот же процесс, который мы использовали выше.
Затем мы будем использовать списки
. transform
, который принимает наш список строк в качестве первого параметра и реализацию интерфейса Function
в качестве второго параметра .
Реализация интерфейса Function
преобразует каждую строку в нашем списке в целое число:
List<Integer> convertedRankList = Lists.transform(Splitter.on(",")
.trimResults()
.splitToList(ranks), new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return Integer.parseInt(input.trim());
}
});
8. Заключение
В этой статье мы преобразовали строки
, разделенные запятыми, в список строк и список целых чисел. Однако мы можем следовать аналогичным процессам для преобразования строки
в список любых примитивных типов данных.
Как всегда, код из этой статьи доступен на Github .