Convert a Comma Separated String to a List in Java – 在Java中把逗号分隔的字符串转换为一个列表

最后修改: 2018年 12月 29日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this tutorial, we’ll look at converting a comma-separated String into a List of strings. Additionally, we’ll transform a comma-separated String of integers to a List of Integers.

在本教程中,我们将研究如何将逗号分隔的字符串转换为字符串的列表。此外,我们将把一个用逗号分隔的整数字符串转换成整数列表

2. Dependencies

2.依赖性

A few of the methods that we’ll use for our conversions require the Apache Commons Lang 3 and Guava libraries. So, let’s add them to our pom.xml file:

我们将用于转换的一些方法需要Apache Commons Lang 3Guava库。因此,让我们把它们添加到我们的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. Defining Our Example

3.界定我们的例子

Before we start, let’s define two inputs strings that we’ll use in our examples. The first string, countries, contains several strings separated by a comma, and the second string, ranks, includes numbers separated by a comma:

在我们开始之前,让我们定义两个输入字符串,我们将在我们的例子中使用。第一个字符串,countries,包含几个用逗号分隔的字符串,第二个字符串,ranks,包含用逗号分隔的数字。

String countries = "Russia,Germany,England,France,Italy";
String ranks = "1,2,3,4,5,6,7";

And, throughout this tutorial, we’ll convert the above strings into lists of strings and integers which we will store in:

而且,在本教程中,我们将把上述字符串转换为字符串和整数的列表,我们将把这些字符串存储在其中。

List<String> convertedCountriesList;
List<Integer> convertedRankList;

Finally, after we perform our conversions, the expected outputs will be:

最后,在我们进行转换后,预期的产出将是。

List<String> expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy");
List<Integer> expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

4. Core Java

4.核心Java

In our first solution, we’ll convert a string to a list of strings and integers using core Java.

在我们的第一个解决方案中,我们将使用核心Java将一个字符串转换为一个字符串和整数的列表。

First, we’ll split our string into an array of strings using split, a String class utility method. Then, we’ll use Arrays.asList on our new array of strings to convert it into a list of strings:

首先,我们将使用split,一个String类的实用方法将我们的字符串分割成一个字符串数组。然后,我们将在新的字符串数组上使用Arrays.asList,将其转换为一个字符串的列表。

List<String> convertedCountriesList = Arrays.asList(countries.split(",", -1));

Let’s now turn our string of numbers to a list of integers.

现在让我们把我们的数字串变成一个整数的列表。

We’ll use the split method to convert our numbers string into an array of strings. Then, we’ll convert each string in our new array to an integer and add it to our list:

我们将使用split方法将我们的数字字符串转换成一个字符串数组。然后,我们将把新数组中的每个字符串转换为一个整数,并将其添加到我们的列表中

String[] convertedRankArray = ranks.split(",");
List<Integer> convertedRankList = new ArrayList<Integer>();
for (String number : convertedRankArray) {
    convertedRankList.add(Integer.parseInt(number.trim()));
}

In both these cases, we use the split utility method from the String class to split the comma-separated string into a string array.

在这两种情况下,我们使用split类中的实用方法,将逗号分隔的字符串分割成一个字符串数组。

Note that the overloaded split method used to convert our countries string contains the second parameter limit, for which we provided the value as -1. This specifies that the separator pattern should be applied as many times as possible.

请注意,用于转换我们的countries字符串的重载split方法包含第二个参数limit,我们为其提供的值是-1。这指定了分离器模式应该被尽可能多地应用。

The split method we used to split our string of integers (ranks) uses zero as the limit, and so it ignores the empty strings, whereas the split used on the countries string retains empty strings in the returned array.

我们用来分割整数字符串(ranks)的split方法使用0作为limit,因此它忽略了空字符串,而用于countries字符串的split则在返回的数组中保留空字符串。

5. Java Streams

5.java流

Now, we’ll implement the same conversions using the Java Stream API.

现在,我们将使用Java Stream API实现同样的转换。

First, we’ll convert our countries string into an array of strings using the split method in the String class. Then, we’ll use the Stream class to convert our array into a list of strings:

首先,我们将使用String类中的split方法将我们的countries字符串转换成字符串数组。然后,我们将使用Stream类将我们的数组转换为字符串的列表。

List<String> convertedCountriesList = Stream.of(countries.split(",", -1))
  .collect(Collectors.toList());

Let’s see how to convert our string of numbers into a list of integers using a Stream.

让我们看看如何使用Stream.将我们的数字字符串转换成一个整数列表。

Again, we’ll first convert the string of numbers into an array of strings using the split method and convert the resulting array to a Stream of String using the of() method in the Stream class.

同样,我们将首先使用split方法将数字字符串转换为字符串数组,并使用Stream类中的of()方法将所得数组转换为StringStream

Then, we’ll trim the leading and trailing spaces from each String on the Stream using map(String::trim).

然后,我们将使用map(String::trim)修剪Stream上每个String的前面和后面的空格。

Next, we’ll apply map(Integer::parseInt) on our stream to convert every string in our Stream to an Integer.

接下来,我们将在我们的流上应用map(Integer::parseInt),将我们Stream中的每个字符串转换为Integer

And finally, we’ll call collect(Collectors.toList()) on the Stream to convert it to an integer list:

最后,我们将在Stream上调用collect(Collectors.toList()),将其转换为一个整数列表。

List<Integer> convertedRankList = Stream.of(ranks.split(","))
  .map(String::trim)
  .map(Integer::parseInt)
  .collect(Collectors.toList());

6. Apache Commons Lang

6.阿帕奇公社朗

In this solution, we’ll use the Apache Commons Lang3 library to perform our conversions. Apache Commons Lang3 provides several helper functions to manipulate core Java classes.

在这个解决方案中,我们将使用Apache Commons Lang3库来执行我们的转换。Apache Commons Lang3提供了几个辅助函数来操作核心Java类。

First, we’ll split our string into an array of strings using StringUtils.splitPreserveAllTokens. Then, we’ll convert our new string array into a list using Arrays.asList method:

首先,我们将使用StringUtils.splitPreserveAllTokens.将我们的字符串分割成一个字符串数组,然后,我们将使用Arrays.asList方法将我们的新字符串数组转换成一个列表。

List<String> convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));

Let’s now transform our string of numbers to a list of integers.

现在让我们把我们的数字串转换成一个整数列表。

We’ll again use the StringUtils.split method to create an array of strings from our string. Then, we’ll convert each string in our new array into an integer using Integer.parseInt and add the converted integer to our list:

我们将再次使用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()));
}

In this example, we used the splitPreserveAllTokens method to split our countries string, whereas we used the split method to split our ranks string.

在这个例子中,我们使用splitPreserveAllTokens方法来分割我们的countries字符串,而我们使用split方法来分割我们的ranks字符串。

Even though both these functions split the string into an array, the splitPreserveAllTokens preserves all tokens including the empty strings created by adjoining separators, while the split method ignores the empty strings.

尽管这两个函数都将字符串分割成了一个数组,但splitPreserveAllTokens保留了所有的标记,包括由相邻的分隔符创建的空字符串,而split方法忽略了空字符串

So, if we have empty strings that we want to be included in our list, then we should use the splitPreserveAllTokens instead of split.

因此,如果我们有空的字符串希望被包含在我们的列表中,那么我们应该使用splitPreserveAllTokens而不是split

7. Guava

7.番石榴

Finally, we’ll use the Guava library to convert our strings to their appropriate lists.

最后,我们将使用Guava库来将我们的字符串转换为相应的列表。

To convert our countries string, we’ll first call Splitter.on with a comma as the parameter to specify what character our string should be split on.

为了转换我们的countries 字符串,我们将首先调用Splitter.on ,用逗号作为参数来指定我们的字符串应该在哪个字符上被分割。

Then, we’ll use the trimResults method on our Splitter instance. This will ignore all leading and trailing white spaces from the created substrings.

然后,我们将对我们的Splitter实例使用trimResults方法。这将忽略创建的子字符串中的所有前导和尾部的白色空间。

Finally, we’ll use the splitToList method to split our input string and convert it to a list:

最后,我们将使用splitToList方法来分割我们的输入字符串并将其转换为一个列表。

List<String> convertedCountriesList = Splitter.on(",")
  .trimResults()
  .splitToList(countries);

Now, let’s convert the string of numbers to a list of integers.

现在,让我们把这串数字转换成一个整数列表.

We’ll again convert the string of numbers into a list of strings using the same process we followed above.

我们将再次使用上面的相同过程将数字字符串转换成字符串列表

Then, we’ll use the Lists.transform method, which accepts our list of strings as the first parameter an implementation of the Function interface as the second parameter.

然后,我们将使用Lists.transform方法,它接受我们的字符串列表作为第一个参数,接受Function接口的实现作为第二个参数

The Function interface implementation converts each string in our list to an integer:

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. Conclusion

8.结语

In this article, we converted comma-separated Strings into a list of strings and a list of integers. However, we can follow similar processes to convert a String into a list of any primitive data types.

在这篇文章中,我们将逗号分隔的字符串转换为字符串列表和整数列表。然而,我们可以按照类似的过程将String转换成任何原始数据类型的列表。

As always, the code from this article is available over on Github.

像往常一样,本文的代码可在Github上获得