企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 用 Java8 的`StringJoiner`连接字符串 原文:http://zetcode.com/articles/java8stringjoiner/ 在本文中,我们介绍了用于连接字符串的新 Java8 API。 Java 多年来缺乏用于简单字符串连接的 API。 在 Java8 中,引入了`StringJoiner`。 `StringJoiner`用于构造由定界符分隔的字符序列,并可选地以提供的前缀开始并以提供的后缀结束。 `StringJoiner`也由`String`类的`join()`方法在内部使用。 ## 使用`StringJoiner` 下面的示例将数字与`StringJoiner`类相连。 `Java8StringJoinEx.java` ```java package com.zetcode; import java.util.StringJoiner; public class Java8StringJoinEx { public static void main(String[] args) { StringJoiner join = new StringJoiner(","); join.add("1"); join.add("2"); join.add("3"); join.add("4"); join.add("5"); System.out.println(join); } } ``` 该示例连接了五个数字,并将最终字符串输出到控制台。 ```java StringJoiner join = new StringJoiner(","); ``` 将创建`StringJoiner`类的新实例。 逗号字符用作分隔符。 ```java join.add("1"); join.add("2"); join.add("3"); join.add("4"); join.add("5"); ``` `add()`方法添加了五个值。 ```java System.out.println(join); ``` `StringJoiner`转换为字符串并打印到控制台。 ```java $ java com.zetcode.Java8StringJoinEx 1,2,3,4,5 ``` 这是示例的输出。 ## `String.join()`方法 在第二个示例中,我们使用`String.join()`方法连接字符串。 `Java8StringJoinEx2.java` ```java package com.zetcode; public class Java8StringJoinEx2 { public static void main(String[] args) { String join = String.join("/", "2016", "8", "5"); System.out.println(join); } } ``` `String.join()`方法在内部使用`StringJoiner`。 ```java String join = String.join("/", "2016", "8", "5"); ``` 日期与`String.join()`方法连接在一起。 ```java $ java com.zetcode.Java8StringJoinEx2 2016/8/5 ``` This is the output of the example. ## 连接列表 第三个示例连接列表的元素。 `Java8StringJoinEx3.java` ```java package com.zetcode; import java.util.Arrays; import java.util.List; public class Java8StringJoinEx3 { public static void main(String[] args) { List<String> list = Arrays.asList("Today", "is", "a", "beautiful", "day"); String joined = String.join(" ", list); System.out.println(joined); } } ``` 可以将列表作为参数传递给`String.join()`方法。 ```java String joined = String.join(" ", list); ``` 列表中的元素以单个空格字符连接。 ```java $ java com.zetcode.Java8StringJoinEx3 Today is a beautiful day ``` 列表中的元素被连接起来以创建一个句子。 ## 读取 CSV 文件 以下示例从 CSV 文件中读取数字,然后将其与`StringJoiner`结合在一起。 我们使用 Gradle 构建工具构建示例。 ```java $ tree . ├── build.gradle └── src └── main ├── java │ └── com │ └── zetcode │ └── Java8StringJoinEx4.java └── resources └── numbers.csv 6 directories, 3 files ``` 该示例具有他的项目结构。 我们将要读取的数字位于`resources`目录中。 `build.gradle` ```java version '1.0' apply plugin: 'java' apply plugin: 'application' sourceCompatibility = 1.8 mainClassName = "com.zetcode.Java8StringJoinEx4" ``` 这是 Gradle 构建文件。 `numbers.csv` ```java 13,24,35,16,50 ``` 这是`numbers.csv`文件。 `Java8StringJoinEx4.java` ```java package com.zetcode; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.util.StringJoiner; public class Java8StringJoinEx4 { public static void main(String[] args) throws FileNotFoundException { Scanner scanner = new Scanner(new File("src/main/resources/numbers.csv")); scanner.useDelimiter(","); StringJoiner join = new StringJoiner("|"); while (scanner.hasNext()) { join.add(scanner.next()); } scanner.close(); System.out.println(join); } } ``` 该示例读取包含数字的 CSV 文件,并使用其他定界符将它们与`StringJoiner`结合在一起。 ```java Scanner scanner = new Scanner(new File("src/main/resources/numbers.csv")); scanner.useDelimiter(","); ``` 使用`Scanner`类读取值。 数字之间用逗号分隔,因此我们使用`useDelimiter()`方法设置逗号分隔符。 ```java StringJoiner join = new StringJoiner("|"); ``` `StringJoiner`类用`"|"`定界符实例化。 ```java while (scanner.hasNext()) { join.add(scanner.next()); } ``` 我们使用扫描器检索值并将其与连接器连接。 ```java $ gradle build :compileJava :processResources :classes :jar :startScripts :distTar :distZip :assemble :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE :check UP-TO-DATE :build BUILD SUCCESSFUL ``` 我们使用`gradle build`命令构建项目。 ```java $ gradle run :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :run 13|24|35|16|50 ``` 我们使用`gradle run`命令运行该应用。 最后一行是我们应用的输出。 ## 编写 CSV 文件 下一个示例将数字写入 CSV 文件。 ```java $ tree . ├── build.gradle └── src └── main └── java └── com └── zetcode └── Java8StringJoinEx5.java ``` 该示例具有他的项目结构。 我们将在当前工作目录中创建一个新文件。 `build.gradle` ```java version '1.0' apply plugin: 'java' apply plugin: 'application' sourceCompatibility = 1.8 mainClassName = "com.zetcode.Java8StringJoinEx5" ``` This is the Gradle build file. `Java8StringJoinEx5.java` ```java package com.zetcode; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.StringJoiner; public class Java8StringJoinEx5 { public static void main(String[] args) throws FileNotFoundException, IOException { StringJoiner join = new StringJoiner(","); join.add("21"); join.add("43"); join.add("54"); join.add("76"); join.add("98"); File newFile = new File("numbers2.csv"); newFile.createNewFile(); PrintWriter pw = new PrintWriter(newFile); pw.write(join.toString()); pw.close(); } } ``` 该示例将五个数字与`StringJoiner`结合在一起,然后将所包含的字符串写入 CSV 文件。 ```java StringJoiner join = new StringJoiner(","); join.add("21"); join.add("43"); join.add("54"); join.add("76"); join.add("98"); ``` 五个数字与`StringJoiner`连接在一起。 数字用逗号分隔。 ```java File newFile = new File("numbers.csv"); newFile.createNewFile(); ``` 在当前工作目录中创建一个新的文件对象。 ```java File newFile = new File("numbers.csv"); newFile.createNewFile(); ``` A new file object is created in the current working directory. ```java PrintWriter pw = new PrintWriter(newFile); pw.write(join.toString()); pw.close(); ``` 合并的值将写入文件。 ```java $ gradle build run ``` 我们构建并运行该应用。 ```java $ cat numbers2.csv 21,43,54,76,98 ``` 我们显示创建文件的内容。 ## `Collectors.joining()` Java8 还在新的流 API 中引入了`Collectors.joining()`方法。 该方法返回一个`Collector`,它按遇到顺序连接由指定定界符分隔的输入元素。 `Java8CollectorJoiningEx.java` ```java package com.zetcode; import java.util.stream.Collectors; import java.util.stream.Stream; public class Java8CollectorJoiningEx { public static void main(String[] args) { Stream<String> stream = Stream.of("Jan", "Peter", "Robert"); String names = stream.collect(Collectors.joining(" ")); System.out.println(names); } } ``` 该示例使用流 API 连接三个名称。 ```java $ java com.zetcode.Java8CollectorJoiningEx Jan Peter Robert ``` This is the output of the example. 在本文中,我们使用了 Java8 中引入的新类`StringJoiner`。我们还添加了一个小示例,显示了来自流 API 的新`Collectors.joining()`。 您可能也对以下相关教程感兴趣: [Java 教程](/lang/java/), [Java8 `forEach`教程](/articles/java8foreach/),[Google Guava 简介](/articles/guava/),[在 Java 中过滤列表](/articles/javafilterlist/)或 [Android 教程](/mob/android/)。