將列表轉換為逗號分隔的字符串
一、簡介
List
轉換仍然是一個熱門話題,因為它是我們作為 Java 開發人員經常做的事情。在本教程中,我們將學習如何使用四種不同的方法將String
List
轉換為逗號分隔的String
。
2.使用Java 8+
我們將使用自 Java 8 以來可用的三個不同的類及其方法進行轉換。
讓我們將以下列表作為即將到來的示例的輸入:
List<String> arraysAsList = Arrays.asList("ONE", "TWO", "THREE");
2.1。 String
首先,我們將使用String
類,它具有許多用於String
處理的實用程序並提供轉換方法join()
:
String commaSeparatedString = String.join(",", arraysAsList);
assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");
2.2. StringJoiner
其次,我們將使用StringJoiner
類,它有一個接受CharSequence
分隔符作為參數的構造函數:
StringJoiner stringJoiner = new StringJoiner(",");
arraysAsList.stream()
.forEach(v -> stringJoiner.add(v));
String commaSeparatedString = stringJoiner.toString();
assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");
還有另一個構造函數,它接受一個CharSequence
分隔符,一個CharSequence
作為前綴,另一個作為後綴:
StringJoiner stringJoinerWithDelimiterPrefixSuffix = new StringJoiner(",", "[", "]");
arraysAsList.stream()
.forEach(v -> stringJoinerWithDelimiterPrefixSuffix.add(v));
String commaSeparatedStringWithDelimiterPrefixSuffix = stringJoinerWithDelimiterPrefixSuffix.toString();
assertThat(commaSeparatedStringWithDelimiterPrefixSuffix).isEqualTo("[ONE,TWO,THREE]");
2.3. Collectors
第三, Collectors
類提供了各種具有不同簽名的實用程序和joining()
方法。
首先讓我們看看如何使用Collectors.joining()
方法將collect()
方法應用於Stream
, 它將CharSequence
分隔符作為輸入:
String commaSeparatedUsingCollect = arraysAsList.stream()
.collect(Collectors.joining(","));
assertThat(commaSeparatedUsingCollect).isEqualTo("ONE,TWO,THREE");
在我們的下一個示例中,我們將看到如何使用map()
方法將列表的每個對象轉換為String
,然後應用方法collect()
和Collectors.
joining()
:
String commaSeparatedObjectToString = arraysAsList.stream()
.map(Object::toString)
.collect(Collectors.joining(","));
assertThat(commaSeparatedObjectToString).isEqualTo("ONE,TWO,THREE");
接下來,我們將使用map()
方法將列表元素轉換為String
,然後應用方法collect()
和Collectors.joining()
:
String commaSeparatedStringValueOf = arraysAsList.stream()
.map(String::valueOf)
.collect(Collectors.joining(","));
assertThat(commaSeparatedStringValueOf).isEqualTo("ONE,TWO,THREE");
現在,讓我們像上面一樣使用map()
,然後是Collectors.
joining()
方法,它輸入一個CharSequence
分隔符,一個CharSequence
作為前綴,一個CharSequence
作為後綴:
String commaSeparatedStringValueOfWithDelimiterPrefixSuffix = arraysAsList.stream()
.map(String::valueOf)
.collect(Collectors.joining(",", "[", "]"));
assertThat(commaSeparatedStringValueOfWithDelimiterPrefixSuffix).isEqualTo("[ONE,TWO,THREE]");
最後,我們將看到如何使用reduce()
方法而不是collect()
來轉換列表:
String commaSeparatedUsingReduce = arraysAsList.stream()
.reduce((x, y) -> x + "," + y)
.get();
assertThat(commaSeparatedUsingReduce).isEqualTo("ONE,TWO,THREE");
3. 使用 Apache Commons Lang
或者,我們也可以使用 Apache Commons Lang 庫提供的實用程序類而不是 Java 類。
我們必須在pom.xml
文件中添加一個依賴項才能使用 Apache 的StringUtils
類:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
join()
方法有各種實現,可以接受輸入,如一系列元素、值的Iterator
,以及多種形式的分隔符,如String
或char
:
String commaSeparatedString = StringUtils.join(arraysAsList, ",");
assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");
如果傳遞給join()
的信息是一個Object數組,它也需要一個int
作為 startIndex 和一個int
作為 endIndex:
String commaSeparatedStringIndex = StringUtils.join(arraysAsList.toArray(), ",", 0, 3);
assertThat(commaSeparatedStringIndex).isEqualTo("ONE,TWO,THREE");
4.使用Spring Core
Spring Core 庫類似地提供了一個實用程序類,該類具有用於這種類型轉換的方法。
我們首先在pom.xml
文件中添加一個依賴項以使用 Spring 的 Core StringUtils
類:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.22</version>
</dependency>
Spring 的核心StringUtils
類提供了一個方法, collectionToCommaDelimitedString(),
它以逗號作為默認分隔符,將要轉換的Collection
作為參數:
String collectionToCommaDelimitedString = StringUtils.collectionToCommaDelimitedString(arraysAsList);
assertThat(collectionToCommaDelimitedString).isEqualTo("ONE,TWO,THREE");
第二種方法collectionToDelimitedString(),
將要轉換的Collection
和String
分隔符作為參數:
String collectionToDelimitedString = StringUtils.collectionToDelimitedString(arraysAsList, ",");
assertThat(collectionToDelimitedString).isEqualTo("ONE,TWO,THREE");
5. 使用谷歌番石榴
最後,我們將使用 Google Guava 庫。
我們必須在pom.xml
文件中添加一個依賴項才能使用 Google 的 Guava Joiner
類:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
Google 的 Guava Joiner
類提供了我們可以應用的各種方法。
第一個方法是on(),
它將String
作為分隔符參數,然後第二個方法是join()
方法,它將具有要轉換的值的Iterable
作為參數:
String commaSeparatedString = Joiner.on(",")
.join(arraysAsList);
assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");
讓我們為下一個示例使用另一個包含一些null
值的列表:
List<String> arraysAsListWithNull = Arrays.asList("ONE", null, "TWO", null, "THREE");
鑑於此,我們可以在on()
和join()
之間使用其他方法,其中之一是skipNulls()
方法。我們可以使用它來避免從Iterable:
內部轉換null
值:
String commaSeparatedStringSkipNulls = Joiner.on(",")
.skipNulls()
.join(arraysAsListWithNull);
assertThat(commaSeparatedStringSkipNulls).isEqualTo("ONE,TWO,THREE");
另一種選擇是使用useForNull(),
它將String
值作為參數替換Iterable
中的null
值進行轉換:
String commaSeparatedStringUseForNull = Joiner.on(",")
.useForNull(" ")
.join(arraysAsListWithNull);
assertThat(commaSeparatedStringUseForNull).isEqualTo("ONE, ,TWO, ,THREE");
六,結論
在本文中,我們看到了將List
轉換為逗號分隔的String
的各種String
。最後,由我們決定哪些庫和實用程序類更適合我們的目的。
與往常一樣,可以在 GitHub 上找到本文的完整代碼示例。