跳转至

用 Java8 的StringJoiner连接字符串

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

在本文中,我们介绍了用于连接字符串的新 Java8 API。 Java 多年来缺乏用于简单字符串连接的 API。 在 Java8 中,引入了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()

Java8 还在新的流 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.

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

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



回到顶部