在本文中,我们介绍了用于连接字符串的新 Java 8 API。 Java 多年来缺乏用于简单字符串连接的 API。 在 Java 8 中,引入了StringJoiner
。
StringJoiner 用于构造由定界符分隔的字符序列,并可选地以提供的前缀开始并以提供的后缀结束。
StringJoiner
也由String
类的join()
方法在内部使用。
使用StringJoiner
下面的示例将数字与StringJoiner
类相连。
Java8StringJoinEx.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);
}
}
该示例连接了五个数字,并将最终字符串输出到控制台。
StringJoiner join = new StringJoiner(",");
将创建StringJoiner
类的新实例。 逗号字符用作分隔符。
join.add("1");
join.add("2");
join.add("3");
join.add("4");
join.add("5");
add()
方法添加了五个值。
System.out.println(join);
StringJoiner
转换为字符串并打印到控制台。
$ java com.zetcode.Java8StringJoinEx
1,2,3,4,5
这是示例的输出。
String.join()
方法
在第二个示例中,我们使用String.join()
方法连接字符串。
Java8StringJoinEx2.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
。
String join = String.join("/", "2016", "8", "5");
日期与String.join()
方法连接在一起。
$ java com.zetcode.Java8StringJoinEx2
2016/8/5
This is the output of the example.
连接列表
第三个示例连接列表的元素。
Java8StringJoinEx3.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()
方法。
String joined = String.join(" ", list);
列表中的元素以单个空格字符连接。
$ java com.zetcode.Java8StringJoinEx3
Today is a beautiful day
列表中的元素被连接起来以创建一个句子。
读取 CSV 文件
以下示例从 CSV 文件中读取数字,然后将其与StringJoiner
结合在一起。 我们使用 Gradle 构建工具构建示例。
$ tree
.
├── build.gradle
└── src
└── main
├── java
│ └── com
│ └── zetcode
│ └── Java8StringJoinEx4.java
└── resources
└── numbers.csv
6 directories, 3 files
该示例具有他的项目结构。 我们将要读取的数字位于resources
目录中。
build.gradle
version '1.0'
apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = 1.8
mainClassName = "com.zetcode.Java8StringJoinEx4"
这是 Gradle 构建文件。
numbers.csv
13,24,35,16,50
这是numbers.csv
文件。
Java8StringJoinEx4.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
结合在一起。
Scanner scanner = new Scanner(new File("src/main/resources/numbers.csv"));
scanner.useDelimiter(",");
使用Scanner
类读取值。 数字之间用逗号分隔,因此我们使用useDelimiter()
方法设置逗号分隔符。
StringJoiner join = new StringJoiner("|");
StringJoiner
类用“ |”实例化。 定界符。
while (scanner.hasNext()) {
join.add(scanner.next());
}
我们使用扫描器检索值并将其与连接器连接。
$ 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
命令构建项目。
$ gradle run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
13|24|35|16|50
我们使用gradle run
命令运行该应用。 最后一行是我们应用的输出。
编写 CSV 文件
下一个示例将数字写入 CSV 文件。
$ tree
.
├── build.gradle
└── src
└── main
└── java
└── com
└── zetcode
└── Java8StringJoinEx5.java
该示例具有他的项目结构。 我们将在当前工作目录中创建一个新文件。
build.gradle
version '1.0'
apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = 1.8
mainClassName = "com.zetcode.Java8StringJoinEx5"
This is the Gradle build file.
Java8StringJoinEx5.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 文件。
StringJoiner join = new StringJoiner(",");
join.add("21");
join.add("43");
join.add("54");
join.add("76");
join.add("98");
五个数字与StringJoiner
连接在一起。 数字用逗号分隔。
File newFile = new File("numbers.csv");
newFile.createNewFile();
在当前工作目录中创建一个新的文件对象。
File newFile = new File("numbers.csv");
newFile.createNewFile();
A new file object is created in the current working directory.
PrintWriter pw = new PrintWriter(newFile);
pw.write(join.toString());
pw.close();
合并的值将写入文件。
$ gradle build run
我们构建并运行该应用。
$ cat numbers2.csv
21,43,54,76,98
我们显示创建文件的内容。
Collectors.joining()
Java 8 还在新的流 API 中引入了Collectors.joining()
方法。 该方法返回一个Collector
,它按遇到顺序连接由指定定界符分隔的输入元素。
Java8CollectorJoiningEx.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 com.zetcode.Java8CollectorJoiningEx
Jan Peter Robert
This is the output of the example.
在本文中,我们使用了 Java 8 中引入的新类StringJoiner
。我们还添加了一个小示例,显示了来自流 API 的新Collectors.joining()
。