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 |
static String |
join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
Returns a new |
//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 |
default IntStream |
chars()
Returns a stream of |
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 |
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 + " ");
});
}