String.join

https://docs.oracle.com/javase/8/docs/api/ 

http://www.matools.com/api/java8


1 使用場景 

String集合快速轉化爲指定分隔符分割字符串最後一個元素後面無分隔符

1.1 java8前 

@Test
public void test() {
    //分隔符
    final String SEPARATOR = ",";
    List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
    StringBuilder csvBuilder = new StringBuilder();
    //拼接 除最後一個字符
    for (int i = 0; i < cities.size() - 1; i++) {
        csvBuilder.append(cities.get(i)).append(SEPARATOR);
    }
    //拼接最後一個
    csvBuilder.append(cities.get(cities.size() - 1));
    //Milan,London,New York,San Francisco
    System.out.println(csvBuilder.toString());
}
@Test
public void test() {
    //分隔符
    final String SEPARATOR = ",";
    List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
    StringBuilder csvBuilder = new StringBuilder();
    for (String city : cities) {
        csvBuilder.append(city).append(SEPARATOR);
    }
    String csv = csvBuilder.toString();
    //Milan,London,New York,San Francisco,
    System.out.println(csv);
    //字符串最後也有分隔符 需要刪除
    csv = csv.substring(0, csv.length() - SEPARATOR.length());
    //Milan,London,New York,San Francisco
    System.out.println(csv);
}

1.2 java8後

String.join 可以簡化代碼

@Test
public void test() {
    //分隔符
    final String SEPARATOR = ",";
    List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
    String joinStr = String.join(SEPARATOR, cities);
    //Milan,London,New York,San Francisco
    System.out.println(joinStr);
}

採用java8的Stream api實現前面效果 

@Test
public void test() {
    //分隔符
    final String SEPARATOR = ",";
    List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
    String joinStr = cities.stream().collect(Collectors.joining(SEPARATOR));
    //Milan,London,New York,San Francisco
    System.out.println(joinStr);
}

2 官方文檔

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html 

static String join(CharSequence delimiter, CharSequence... elements)

Returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter.

static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)

Returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter.

//java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)
public static String join(CharSequence delimiter, CharSequence... elements) {

//java.lang.String#join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>)
public static String join(CharSequence delimiter,
		Iterable<? extends CharSequence> elements) {

 

@Test
public void testJoin(){
    String message = String.join("-", "Java", "is", "cool");
    // message returned is: "Java-is-cool"
    System.out.println(message);
}

 

@Test
public void testJoin() {
    List<String> strings = new LinkedList<>();
    strings.add("Java");
    strings.add("is");
    strings.add("cool");
    String message = String.join(" ", strings);
    //message returned is: "Java is cool"
    System.out.println(message);

    String strMessage = strings.stream().collect(Collectors.joining(" "));
    //Java is cool
    System.out.println(strMessage);
}
@Test
public void testJoin(){
    Set<String> strings = new LinkedHashSet<>();
    strings.add("Java");
    strings.add("is");
    strings.add("very");
    strings.add("cool");
    String message = String.join("-", strings);
    //message returned is: "Java-is-very-cool"
    System.out.println(message);
}

3 CharSequence接口

String.join傳入的參數或者迭代器需要實現CharSequence接口;當前們傳入的參數未實現CharSequence接口或者集合的迭代器未實現CharSequence接口程序是會報錯的 Xxx cannot be cast to java.lang.CharSequence

//java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)
public static String join(CharSequence delimiter, CharSequence... elements) {
//java.lang.String#join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>)
public static String join(CharSequence delimiter,
		Iterable<? extends CharSequence> elements) {
//public final class Integer extends Number implements Comparable<Integer> {
@Test
public void test() {
    //分隔符
    final String SEPARATOR = ",";
    List<Integer> cities = Arrays.asList(1,2,3,4,5,6);
    //需要強轉不然編譯器就報錯
    //java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.CharSequence
    String joinStr = String.join(SEPARATOR, (CharSequence) cities);
}

CharSequence是一個描述字符串結構的接口,在這個接口裏面一般有三種常用的子類

// Stirng類
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

// StringBuffer類
public final class StringBuffer
   extends AbstractStringBuilder
   implements java.io.Serializable, CharSequence

// StirngBuilder類
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

https://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html

Modifier and Type Method and Description
char charAt(int index)

Returns the char value at the specified index.

default IntStream chars()

Returns a stream of int zero-extending the char values from this sequence.

default IntStream codePoints()

Returns a stream of code point values from this sequence.

int length()

Returns the length of this character sequence.

CharSequence subSequence(int start, int end)

Returns a CharSequence that is a subsequence of this sequence.

String toString()

Returns a string containing the characters in this sequence in the same order as this sequence.

package java.lang;
public interface CharSequence {
    //
    int length();
    //
    char charAt(int index);
    //
    CharSequence subSequence(int start, int end);
    //
    public String toString();
    //
    public default IntStream chars() {...}
    public default IntStream codePoints() {...}
}
@Test
public void test() {
    CharSequence str = "hello world";
    //11
    System.out.println(str.length());
    //h
    System.out.println(str.charAt(0));
    //world
    System.out.println(str.subSequence(6, 11));
    //hello world
    System.out.println(str.toString());
    //104 101 108 108 111 32 119 111 114 108 100 
    str.chars().forEach((item) -> {
        System.out.print(item + " ");
    });
    System.out.println();
    //104 101 108 108 111 32 119 111 114 108 100 
    str.codePoints().forEach((item) -> {
        System.out.print(item + " ");
    });
}

https://blog.csdn.net/benjaminlee1/article/details/72860845

https://blog.csdn.net/taojin12/article/details/85760432

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章