Java 8 StringJoiner字串聯結器

banq發表於2021-06-11

在這篇簡短的文章中,我們將介紹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 儲存庫中找到

相關文章