原文:http://zetcode.com/articles/java8stringjoiner/

在本文中,我们介绍了用于连接字符串的新 Java8 API。 Java 多年来缺乏用于简单字符串连接的 API。 在 Java8 中,引入了StringJoiner

StringJoiner用于构造由定界符分隔的字符序列,并可选地以提供的前缀开始并以提供的后缀结束。

StringJoiner也由String类的join()方法在内部使用。

使用StringJoiner

下面的示例将数字与StringJoiner类相连。

Java8StringJoinEx.java

  1. package com.zetcode;
  2. import java.util.StringJoiner;
  3. public class Java8StringJoinEx {
  4. public static void main(String[] args) {
  5. StringJoiner join = new StringJoiner(",");
  6. join.add("1");
  7. join.add("2");
  8. join.add("3");
  9. join.add("4");
  10. join.add("5");
  11. System.out.println(join);
  12. }
  13. }

该示例连接了五个数字,并将最终字符串输出到控制台。

  1. StringJoiner join = new StringJoiner(",");

将创建StringJoiner类的新实例。 逗号字符用作分隔符。

  1. join.add("1");
  2. join.add("2");
  3. join.add("3");
  4. join.add("4");
  5. join.add("5");

add()方法添加了五个值。

  1. System.out.println(join);

StringJoiner转换为字符串并打印到控制台。

  1. $ java com.zetcode.Java8StringJoinEx
  2. 1,2,3,4,5

这是示例的输出。

String.join()方法

在第二个示例中,我们使用String.join()方法连接字符串。

Java8StringJoinEx2.java

  1. package com.zetcode;
  2. public class Java8StringJoinEx2 {
  3. public static void main(String[] args) {
  4. String join = String.join("/", "2016", "8", "5");
  5. System.out.println(join);
  6. }
  7. }

String.join()方法在内部使用StringJoiner

  1. String join = String.join("/", "2016", "8", "5");

日期与String.join()方法连接在一起。

  1. $ java com.zetcode.Java8StringJoinEx2
  2. 2016/8/5

This is the output of the example.

连接列表

第三个示例连接列表的元素。

Java8StringJoinEx3.java

  1. package com.zetcode;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. public class Java8StringJoinEx3 {
  5. public static void main(String[] args) {
  6. List<String> list = Arrays.asList("Today", "is", "a", "beautiful", "day");
  7. String joined = String.join(" ", list);
  8. System.out.println(joined);
  9. }
  10. }

可以将列表作为参数传递给String.join()方法。

  1. String joined = String.join(" ", list);

列表中的元素以单个空格字符连接。

  1. $ java com.zetcode.Java8StringJoinEx3
  2. Today is a beautiful day

列表中的元素被连接起来以创建一个句子。

读取 CSV 文件

以下示例从 CSV 文件中读取数字,然后将其与StringJoiner结合在一起。 我们使用 Gradle 构建工具构建示例。

  1. $ tree
  2. .
  3. ├── build.gradle
  4. └── src
  5. └── main
  6. ├── java
  7. └── com
  8. └── zetcode
  9. └── Java8StringJoinEx4.java
  10. └── resources
  11. └── numbers.csv
  12. 6 directories, 3 files

该示例具有他的项目结构。 我们将要读取的数字位于resources目录中。

build.gradle

  1. version '1.0'
  2. apply plugin: 'java'
  3. apply plugin: 'application'
  4. sourceCompatibility = 1.8
  5. mainClassName = "com.zetcode.Java8StringJoinEx4"

这是 Gradle 构建文件。

numbers.csv

  1. 13,24,35,16,50

这是numbers.csv文件。

Java8StringJoinEx4.java

  1. package com.zetcode;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.util.Scanner;
  5. import java.util.StringJoiner;
  6. public class Java8StringJoinEx4 {
  7. public static void main(String[] args) throws FileNotFoundException {
  8. Scanner scanner = new Scanner(new File("src/main/resources/numbers.csv"));
  9. scanner.useDelimiter(",");
  10. StringJoiner join = new StringJoiner("|");
  11. while (scanner.hasNext()) {
  12. join.add(scanner.next());
  13. }
  14. scanner.close();
  15. System.out.println(join);
  16. }
  17. }

该示例读取包含数字的 CSV 文件,并使用其他定界符将它们与StringJoiner结合在一起。

  1. Scanner scanner = new Scanner(new File("src/main/resources/numbers.csv"));
  2. scanner.useDelimiter(",");

使用Scanner类读取值。 数字之间用逗号分隔,因此我们使用useDelimiter()方法设置逗号分隔符。

  1. StringJoiner join = new StringJoiner("|");

StringJoiner类用"|"定界符实例化。

  1. while (scanner.hasNext()) {
  2. join.add(scanner.next());
  3. }

我们使用扫描器检索值并将其与连接器连接。

  1. $ gradle build
  2. :compileJava
  3. :processResources
  4. :classes
  5. :jar
  6. :startScripts
  7. :distTar
  8. :distZip
  9. :assemble
  10. :compileTestJava UP-TO-DATE
  11. :processTestResources UP-TO-DATE
  12. :testClasses UP-TO-DATE
  13. :test UP-TO-DATE
  14. :check UP-TO-DATE
  15. :build
  16. BUILD SUCCESSFUL

我们使用gradle build命令构建项目。

  1. $ gradle run
  2. :compileJava UP-TO-DATE
  3. :processResources UP-TO-DATE
  4. :classes UP-TO-DATE
  5. :run
  6. 13|24|35|16|50

我们使用gradle run命令运行该应用。 最后一行是我们应用的输出。

编写 CSV 文件

下一个示例将数字写入 CSV 文件。

  1. $ tree
  2. .
  3. ├── build.gradle
  4. └── src
  5. └── main
  6. └── java
  7. └── com
  8. └── zetcode
  9. └── Java8StringJoinEx5.java

该示例具有他的项目结构。 我们将在当前工作目录中创建一个新文件。

build.gradle

  1. version '1.0'
  2. apply plugin: 'java'
  3. apply plugin: 'application'
  4. sourceCompatibility = 1.8
  5. mainClassName = "com.zetcode.Java8StringJoinEx5"

This is the Gradle build file.

Java8StringJoinEx5.java

  1. package com.zetcode;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.StringJoiner;
  7. public class Java8StringJoinEx5 {
  8. public static void main(String[] args) throws FileNotFoundException,
  9. IOException {
  10. StringJoiner join = new StringJoiner(",");
  11. join.add("21");
  12. join.add("43");
  13. join.add("54");
  14. join.add("76");
  15. join.add("98");
  16. File newFile = new File("numbers2.csv");
  17. newFile.createNewFile();
  18. PrintWriter pw = new PrintWriter(newFile);
  19. pw.write(join.toString());
  20. pw.close();
  21. }
  22. }

该示例将五个数字与StringJoiner结合在一起,然后将所包含的字符串写入 CSV 文件。

  1. StringJoiner join = new StringJoiner(",");
  2. join.add("21");
  3. join.add("43");
  4. join.add("54");
  5. join.add("76");
  6. join.add("98");

五个数字与StringJoiner连接在一起。 数字用逗号分隔。

  1. File newFile = new File("numbers.csv");
  2. newFile.createNewFile();

在当前工作目录中创建一个新的文件对象。

  1. File newFile = new File("numbers.csv");
  2. newFile.createNewFile();

A new file object is created in the current working directory.

  1. PrintWriter pw = new PrintWriter(newFile);
  2. pw.write(join.toString());
  3. pw.close();

合并的值将写入文件。

  1. $ gradle build run

我们构建并运行该应用。

  1. $ cat numbers2.csv
  2. 21,43,54,76,98

我们显示创建文件的内容。

Collectors.joining()

Java8 还在新的流 API 中引入了Collectors.joining()方法。 该方法返回一个Collector,它按遇到顺序连接由指定定界符分隔的输入元素。

Java8CollectorJoiningEx.java

  1. package com.zetcode;
  2. import java.util.stream.Collectors;
  3. import java.util.stream.Stream;
  4. public class Java8CollectorJoiningEx {
  5. public static void main(String[] args) {
  6. Stream<String> stream = Stream.of("Jan", "Peter", "Robert");
  7. String names = stream.collect(Collectors.joining(" "));
  8. System.out.println(names);
  9. }
  10. }

该示例使用流 API 连接三个名称。

  1. $ java com.zetcode.Java8CollectorJoiningEx
  2. Jan Peter Robert

This is the output of the example.

在本文中,我们使用了 Java8 中引入的新类StringJoiner。我们还添加了一个小示例,显示了来自流 API 的新Collectors.joining()

您可能也对以下相关教程感兴趣: Java 教程Java8 forEach教程Google Guava 简介在 Java 中过滤列表Android 教程