Java 8 StringJoiner字符串连接器

21-06-11 banq

在这篇简短的文章中,我们将介绍Java 8 StringJoiner特性,并将探索有哪些不同的特性以及如何更有效地使用Java 8 Stream API。

在日常编程活动中的一项非常常见的任务中加入多个字符串。在 Java 中没有直接连接多个 String 的方法(除了使用第三方 API)。Java 8引入了一个新类StringJoiner,可用于连接多个字符串。StringJoiner是一种 Collector,在这个类的帮助下,我们可以用特定的分隔符连接多个字符串,它还提供了向最终输出添加前缀和后缀的选项。本文重点介绍 Java 8 StringJoiner 类及其不同的特性。

 

使用分隔符

StringJoiner joiner = new StringJoiner(",");
    joiner.add("Sunday");
    joiner.add("Monday");
    joiner.add("Tuesday");

 System.out.println(joiner.toString());

 

使用分隔符、前缀和后缀

public static void joinerWithDelimiterWithPrefixAndSuffix(){
    StringJoiner joiner = new StringJoiner(",", "Prefix-", "-Suffix");
    joiner.add("Sunday");
    joiner.add("Monday");
    joiner.add("Tuesday");
    joiner.add("Wednesday");

    //display output
    System.out.println(joiner.toString());
}
输出:
Prefix-Sunday-Monday-Tuesday-Wednesday-Suffix

 

多个 StringJoiner

使用 StringJoiner 的merge()方法合并多个StringJoiner:

   StringJoiner joiner1= new StringJoiner("|");
   StringJoiner joiner2= new StringJoiner(";");
   StringJoiner joiner3= new StringJoiner(";");

   joiner2.add("one");
   joiner2.add("two");
   joiner1.merge(joiner2);

   joiner3.add("three");
   joiner3.add("four");
   joiner1.merge(joiner3);

   System.out.println(joiner1.toString());
输出:

one;two|three;four

 

String.join()

StringJoiner由两个静态String.join方法内部使用:

String output= String.join("-", "2017","09","30");
2017-09-30 //output
List<String> list= Arrays.asList("one","two","three");
String output = String.join("-", list);

one-two-three //output

 

Collectors.joining

StringJoiner可以很容易地与新的Java 8 收集器一起使用。这是使用Java 8 StringJoiner类的间接方式。

List<Customer> customers = Arrays.asList(
        new Customer("John", "Smith"),
        new Customer("Umesh", "Awasthi"),
        new Customer("Andy", "Flower")
);

final String customerJoin = customers.stream()
        .map(Customer::getFirstName)
        .collect(Collectors.joining(","));

System.out.println(customerJoin);

输出:

John, Umesh, Andy

 

StringJoiner 和 setEmptyValue 方法

在上面的所有示例中,我们使用了toString()从 joiner 类中获取值的方法。您应该注意以下几点:

  1. 如果没有提供前缀和后缀并且字符串为空,则连接器将返回空字符串。
  2. 对于空字符串和前缀 ans suffix ,joiner 将返回一个包含前缀和后缀的字符串。

这在大多数情况下都有效,但有时,我们可能需要一个不同的默认值,以防字符串为空(我们不想要空字符串),StringJoiner 提供了setEmptyValue()帮助我们设置默认值的方法,以防字符串为空。让我们看一个例子:

import java.util.StringJoiner;

public class StringJoinerExample {

    public static void main(String args) {
        StringJoiner joiner = new StringJoiner(",");
        System.out.println(joiner.toString()); // empty String

        joiner.setEmptyValue("Default Value");

        System.out.println(joiner.toString()); //Default Value
    }
}

仅当StringJoiner为空时才返回默认值Default Value

import java.util.StringJoiner;

public class StringJoinerExample {

    public static void main(String[] args) {
        StringJoiner joiner = new StringJoiner(",");
        System.out.println(joiner.toString()); // empty String

        joiner.setEmptyValue("Default Value");
        joiner.add("Checking");
        joiner.add("setEmptyValue behaviour");
        System.out.println(joiner.toString()); //Checking,setEmptyValue behaviour
    }
}

 

StringJoiner和StringBuilder

使用Java 8 Stream API,StringJoiner 与StringBuilder 相比非常有用。让我们举个例子来理解使用SpringJoiner 和StringBuilder 之间的区别。

List<String> list = Arrays.asList("Foo","Bar");

//join string using StringJoiner
String output = list.stream().collect(Collectors.joining(","));

//using StringBuilder

String collectoutput =
        list.stream().collect(Collector.of(StringBuilder::new,
                (stringBuilder, str) -> stringBuilder.append(str).append(", "),
                StringBuilder::append,
                StringBuilder::toString));

 

概括

在这篇文章中,我们得到了Java8 StringJoiner的介绍。我们探索了 StringJoiner 类的各种功能以及如何使用它来连接多个字符串。我们也可以将 StringJoiner 视为一种收集器,在处理并行流时非常有用。源代码可在我们的GitHub 存储库中找到

猜你喜欢